常见排序方法
比較常用的排序方法(升序):
冒泡排序:最常用的排序方法。大體思路就是每次選出一個(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é)
- 上一篇: 挺好用的SQLSERVER数据库自动备份
- 下一篇: Java7编程 高级进阶学习笔记--嵌套