排序演算法總結

2021-08-14 16:33:52 字數 2999 閱讀 1915

1、選擇排序 

基本思想:首先,選出最小的數放在第一位,然後選擇第二小的數,放在第二位;以此類推,直到所有的數從小到大排列. 

那麼,對於大小為n的陣列需要n-1輪選擇過程。第i輪選取第i小的數,請將其放在第i個位置上。 

不穩定  

平均時間複雜度o(n^2) 

最好情況o(n^2) 

最壞情況o(n^2) 

空間複雜度o(1) 

*/  

void select_sort(int a, int n)  

if(i != min_index)  

}  }  

/* 2、氣泡排序 

基本思想: 不斷比較相鄰的兩個數,讓較大的數不斷地往後移。經過一番比較,就選出了最大的數。經過第二輪比較,就選出了次大的數。以此類推。 

那麼對於大小為n的陣列,需要n-1輪比較。 

平均時間複雜度o(n^2) 

最好情況o(n) 

最壞情況o(n^2) 

空間複雜度o(1) 

*/  

void bubble_sort(int a,int n)  

}  if(is_sorted)//如果沒有發生交換,說明已經排好序了,提前退出迴圈,所以最好情況下時間複雜度為o(n)  

break;  

}  }  

/* 3、快速排序 

基本思想:採用分而治之的思想,將要排序的數分成左右兩部分,其中一部分的資料比key小,另一部分資料比key大。然後將所分得的兩部分資料進行同樣的劃分。重複執行以上的劃分操作。 

平均時間複雜度o(nlog2(n)) 

最好情況o(nlog2(n)) 

最壞情況o(n^2) 

空間複雜度o(nlog2(n)) 

*/  

int partition(int arr, int low, int high)//返回劃分的中間值  

if(low < high)  

arr[low ++] = arr[high];//找到合適的資料填到了low坑,但是形成了high坑,繼續找合適的資料  

while( low < high && arr[low] <= key)  

low ++;  

if( low < high)  

arr[high --] =  arr[low];//low又成了坑  

}  arr[low] = key;//將key填到這個坑  

return low;  

}  void quick_sort(int num, int low, int high)  

}  4、插入排序 

基本思想:將元素逐個新增到已經排好序的陣列中去。 

平均時間複雜度o(n^2) 

最好時間複雜度o(n) 

最壞時間複雜度o(n^2) 

空間複雜度o(1) 

*/  

void insert_sort(int a, int n)  

//如果找到合適位置i應該!=j,如果i==j,說明i正好在正確的位置  

if( i != j)  

}  }  

/* 5、希爾排序 

基本思想:將無序陣列分成若干個子串行,子串行不是逐段分割的,而是相隔特定增量。對各個子串行進行插入排序。 

然後再選擇乙個更小的增量,再將陣列分割成多個子串行進行排序。最後選擇增量為1,即使用直接插入排序,使最終陣列成為有序陣列。 

平均時間複雜度o(n^1.3) 

最好時間複雜度o(n) 

最壞時間複雜度o(n^2) 

空間複雜度o(1) 

*/  

void shell_sort(int a, int n)  

}  }  }  

/* 6、歸併排序: 

基本思想:將待排序序列【0,n-1】看成是n個長度為1的有序序列,將相鄰的有序表成對歸併,得到n/2個長度為2的有序表。再次歸併,得到n/4個長度為4的有序表。 

依次類推,最後得到長度為n的1個有序表。 

所以歸併排序其實要做兩件事: 

1、先遞迴的分解數列, 

2、再合併數列就完成了歸併排序。 

先來考慮如何合併? 

每次合併過程中都要對兩個有序的序列段進行合併,然後排序 

待合併的兩個有序序列段分別為 r[low, mid] 和 r[mid+1, high] 

先將它們合併到乙個暫存陣列r2,合併完再將r2複製回r1中。 

這樣一次合併排序就完成了。 

最好、最壞和平均時間複雜度都是o(nlogn), 

空間複雜度是o(n) 

*/  

void merge(int a, int low ,int mid, int high,int tmp)  

while( i <= mid)  

tmp[k++] = a[i++];  

while( j <= high)  

tmp[k++] = a[i++];  

//最後再複製回a  

for(i = 0; i < k; i++ )  

a[low+i] = tmp[i];//!!!!此處a是從low開始,tmp是從0開始。  

}  void merge_sort(int a,int low, int high, int tmp)  

}  bool sort(int a, int n)  

/* 堆排序 

*/  

int main()  

;  //select_sort(num, 7);  

//bubble_sort(num,7);  

//quick_sort(num,0,6);  

quicksort2(num, 0, 6);  

//insert_sort(num,7);  

//shell_sort(num,7);  

//sort(num,7);  

for(int i = 0; i < 7; i++)  

return 0;  

}  

排序演算法總結

1 直接插入排序 1 穩定性 穩定 2 適用情況 待排記錄規模較小,或者記錄已經基本有序 2 希爾排序 1 穩定性 不穩定 2 特點 希爾排序的執行時間依賴於增量序列,它的效率比直接插入排序有較大的改進。3 氣泡排序 1 穩定性 穩定 2 特點 當待排記錄基本有序是,氣泡排序是不錯的選擇 但由於氣泡...

排序演算法總結

1 選擇排序 選擇排序的思想是依次從待排序數列中選擇最大 小 的 第二大 小 的等等,然後依次重新排列為有序數列。void selectionsort int a,int n if min i 時間複雜度o n 2 2 歸併排序 void merge int a,int left,int mid,i...

排序演算法總結

學習了這麼多的排序演算法,還沒有做個總結,呵呵 氣泡排序 氣泡排序是最慢的排序演算法。在實際運用中它是效率最低的演算法。它通過一趟又一趟地比較陣列中的每乙個元素,使較大的資料下沉,較小的資料上公升。它是 o n 2 的演算法。快速排序 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來...