排序问题

(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)

 

posted @ 2018-03-16 23:31  赵永驰  阅读(79)  评论(0编辑  收藏  举报