(1)插入排序
1 void insertSort(int arr[], int n){ 2 int i,j,t; 3 4 for(i=1; i<n; i++){ 5 t = arr[i]; 6 for(j=i-1; arr[j]>t && j>=0; j--){ 7 arr[j+1] = arr[j]; 8 } 9 arr[j+1] = t; 10 } 11 }
(2)简单的快速排序
1 void q_sort(int arr[], int sp, int ep){ 2 int m, i, t; 3 4 if(sp >= ep) 5 return; 6 else{ 7 m = sp; 8 for(i=sp+1; i<=ep; i++){ 9 if(arr[i] < arr[sp]){ 10 m++; 11 t = arr[m]; 12 arr[m] = arr[i]; 13 arr[i] = t; 14 } 15 } 16 17 t = arr[sp]; 18 arr[sp] = arr[m]; 19 arr[m] = t; 20 21 q_sort(arr, sp, m-1); 22 q_sort(arr, m+1, ep); 23 } 24 }
原理:利用分治的思想,将数组排序范围最左端的元素作为参照,将比其小的元素移到其左边,将比其大的元素移动到其右边,在分别对两边的进行递归排序即可。
(3)更好的几种快速排序
1、双向划分
1 void q_sort2(int arr[], int sp, int ep){ 2 int i, j, t; 3 if(sp >= ep) 4 return; 5 else{ 6 i = sp; 7 j = ep + 1; 8 while(1){ 9 do{i++;} while(i<=ep && arr[i]<arr[sp]); 10 do{j--;} while(j>=sp && arr[j]>arr[sp]); 11 12 if(i>j) break; 13 else{ 14 t = arr[i]; 15 arr[i] = arr[j]; 16 arr[j] = t; 17 } 18 } 19 20 t = arr[sp]; 21 arr[sp] = arr[j]; 22 arr[j] = t; 23 24 q_sort2(arr, sp, j-1); 25 q_sort2(arr, j+1, ep); 26 } 27 }
2、随机选取参照元素
将sp出的元素与[sp, ep]中随机的某个元素进行交换,再以sp处的元素作为参照进行分割排序,可以使得最差复杂度也趋近于O(nlogn)