日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

常见排序方法

發(fā)布時(shí)間:2025/7/14 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 常见排序方法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

比較常用的排序方法(升序):

冒泡排序:最常用的排序方法。大體思路就是每次選出一個(gè)最大值,第二次選出次大值,基本上就是兩個(gè)for循環(huán)。

雞尾酒排序:冒泡排序方法的變種,雞尾酒排序,待排序數(shù)組首先從0->n-1找出最大值,然后n-2->0找出最小值,然后再?gòu)?->n-2找次大值……依次類推……一個(gè)while循環(huán),里面套兩個(gè)for循環(huán)即可。

奇偶排序:也是冒泡排序的變種。一個(gè)while循環(huán),里面兩個(gè)for循環(huán),但是一個(gè)for循環(huán)從0開始,一個(gè)從1開始,每次加2,比較相鄰兩個(gè)數(shù)值大小。

?

快速排序:是分之思想的一種體現(xiàn)。對(duì)于一個(gè)待排序隊(duì)列,首先選擇一個(gè)基準(zhǔn),掃描數(shù)據(jù),大于這個(gè)基準(zhǔn)數(shù)據(jù)的元素放在右側(cè),小于的放在左側(cè),然后左側(cè)和右側(cè)的數(shù)據(jù)又是待排序隊(duì)列,再分別選擇基準(zhǔn)……遞歸下去,知道全部都是有序的。

?

插入排序:是一種比較直觀的排序方法,從待排序隊(duì)列中構(gòu)建有序隊(duì)列,把剩余的待排序數(shù)據(jù)插入到有序隊(duì)列中。

希爾排序:分步長(zhǎng)排序法,對(duì)相隔步長(zhǎng)的數(shù)據(jù)分別進(jìn)行排序,然后減小步長(zhǎng),直至步長(zhǎng)為1,主要可以減少數(shù)據(jù)的移動(dòng)次數(shù)。

?

選擇排序:選擇一個(gè)最大元素放入隊(duì)尾,然后從剩余的元素中選擇最大的放入隊(duì)尾的前一位置,直到待排序數(shù)組中只有一個(gè)元素為止。

堆排序算法:選擇排序的一種,不停的構(gòu)建大(小)頂堆,然后取出頂,得到有序序列。

?

歸并排序:也是典型的分治法思想的應(yīng)用,是把兩個(gè)有序的序列合并成一個(gè)有序序列。其中這兩個(gè)有序序列分別是有兩個(gè)有序序列合并而成。

?

基數(shù)排序:是一種比較型整數(shù)排序算法,把待比較的數(shù)值按照位數(shù)切割成不同的數(shù)值,從權(quán)值小的位開始比較大小,每個(gè)位數(shù)分別比較。

分類排序方法穩(wěn)定性平均時(shí)間復(fù)雜度空間復(fù)雜度
交換排序冒泡排序穩(wěn)定O(n2)O(1)
雞尾酒排序穩(wěn)定O(n2)O(1)
奇偶排序穩(wěn)定O(n2)O(1)
快速排序不穩(wěn)定O(nlogn)O(logn)~O(n)
插入排序直接插入排序穩(wěn)定O(n2)O(1)
希爾排序不穩(wěn)定O(n1.25)O(1)
選擇排序選擇排序不穩(wěn)定O(n2)O(1)
堆排序不穩(wěn)定O(nlogn)O(1)
歸并排序歸并排序穩(wěn)定O(nlogn)O(n)
分布排序基數(shù)排序穩(wěn)定O(nd)d為位數(shù)O(nd)

還有一種比較好用的排序方法是二叉樹排序法,是插入排序的一種,平均時(shí)間復(fù)雜度也不高,而且還能夠方便的動(dòng)態(tài)查找。在某些動(dòng)態(tài)查找應(yīng)用中可以很方便的應(yīng)用。關(guān)于二叉樹排序方法可以參考如下鏈接,我在后續(xù)的文章中也會(huì)具體寫二叉排序樹的相關(guān)操作。

常見排序方法:

?

#ifndef SORT_H_INCLUDED #define SORT_H_INCLUDED /**定義了各種排序方法 增序**/void swap(int *a,int *b) {int temp=*a;*a=*b;*b=temp; }///冒泡排序 void bubbling_sort(int * array,int len) {int i,j;for(i=0;i<len,i++){for(j=0;j<len-1-i;j++){if(array[j]>array[j+1]){swap(array[j],array[j+1]);}}} }///快速排序 int partion(int *arr, int left, int right) {int pValue=arr[left],pos=left,i=left;swap(&arr[left],&arr[right]);///保存在最后一個(gè)單元里面while(i++<right-1){if(arr[i]<pValue){swap(&arr[i],&arr[pos++]);}}swap(&arr[right],&arr[pos]);return pos; } //遞歸實(shí)現(xiàn) void quickSort1(int *arr, int left, int right) {int p=0;if(left<right){p=partion(arr,left,right);quickSort1(arr,left,p-1);quickSort1(arr,p+1,right);} }

//非遞歸實(shí)現(xiàn)
void quickSort2(int *arr,int left,int right)
{
  stack<int> positions;
  int pos,l,r;
  if(left<right){//首先計(jì)算一次,把下次要計(jì)算的位置壓入棧中
    pos=partion(arr,left,right);
    if(pos-1>left){
      positions.push(left);
      postions.push(pos-1);
    }
    if(pos+1<right){
      positions.push(pos+1);
      positions.push(right);
    }
  }

  while(!positions.empty()){//依次從棧中取出數(shù)據(jù),進(jìn)行分割
    r=positions.top();
    positions.pop();
    l=positions.top();
    positions.pop();
    pos=partion(arr,l,r); 

    if(pos-1>left){
      positions.push(left);
      postions.push(pos-1);
    }     if(pos+1<right){
      positions.push(pos+1);
      positions.push(right);
    }
  }
} ///堆排序 void heapfiy(int arr, int current, int heap_size) {int l=2*current+1,r=2*current+2,largest=current;if(l<heap_size&&arr[l]>arr[largest]){largest=l;}if(r<heap_size&&arr[r]>arr[largest]){largest=r;}if(largest!=current){swap(&arr[largest],&arr[current]);heapfiy(arr,largest,heap_size);} }void build_heap(int *arr,int len) {int i;for(i=(len-2)/2;i>=0;i--){heapfiy(arr,i,len);} }void heapSort(int *arr,int len) {int i=0;build_heap(arr,len);for(i=len-1;i>=0;i--){swap(&arr[0],&arr[i]);heapfiy(arr,0,i);} }//歸并排序 void merge_min(int* arr1,int len1,int* arr2, int len2) {int *tempSpace=(int*)malloc(sizeof(int)*(len1+len2));int i=0,j=0,k=0;while(i<len1&&j<len2){if(arr1[i]<arr2[j]){tempSpace[k++]=arr1[i++];} else {tempSpace[k++]=arr2[j++];}}while(i<len1){tempSpace[k++]=arr1[i++];}while(j<len2){tempSpace[k++]=arr2[j++];}for(k=0;k<len1+len2;k++){arr1[k]=tempSpace[k];}free(tempSpace); }void merge_sort(int *arr,int n) {if(n<=1) return;int half=n/2;merge_sort(arr,half);merge_sort(arr+half,n-half);merge_min(arr,half,arr+half,n-half); }#endif // SORT_H_INCLUDED

?

?

http://www.cnblogs.com/sdlypyzq/archive/2011/09/10/2172937.html

二叉查找樹

?

轉(zhuǎn)載于:https://www.cnblogs.com/havePassed/p/3585375.html

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的常见排序方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。