算法之排序

一:冒泡排序

 1 void M_sort(long a[], long n)
 2 {
 3     long i,j,flat = 0;
 4     //第一种写法
 5     /*
 6     for (i = 0; i < n - 1; i++)
 7     {
 8         for (j = 0; j < n - 1 - i; j++)
 9         {
10             if (a[j] > a[j + 1])
11                 flat = 1;//改进版
12                 swap(a,j,j+1);
13             }
14         }
15         if(flat == 0) break;
16     }
17     */
18     //第二种写法
19     for(i = n -1 ; i>0; i--)
20     {
21         for(j = 0;j < i ;j++)
22         {
23            
24             if(a[j]>a[j+1])
25             {
26                  flat = 1;
27                 swap(a,j,j+1);
28             }
29         }
30     if(flat == 0 ) break;
31     }
32 }
View Code

二:插入排序

 1 void X_sort(long a[],long n)
 2 {
 3     long x,y;
 4     /*
 5     for(i = 1;i<n;i++)
 6     {
 7        long temp = a[i];  //摸下一张牌
 8         for(j = i;j>0 && a[j-1]>temp;j--)
 9         {
10           
11             a[j] = a[j-1]; 移动空位
12         }
13         a[j] = temp; 插入新位置
14     }*/
15     for(x = 1;x<n;x++)
16     {
17         for(y = x - 1 ; y >= 0 && a[y]>a[y+1];y--)
18         {
19             swap(a,y,y+1);
20         }
21     }
22 }
View Code

三:堆排序

 1 void swap(long A[], int i, int j)
 2 {
 3     long temp = A[i];
 4     A[i] = A[j];
 5     A[j] = temp;
 6 } 
 7 void PrecDown(long A[],int i , int N)
 8 {
 9     int child,parent;
10     int tmp = A[i];
11     for(parent = i;2 * parent + 1 < N;parent = child)
12     {
13         child = 2 * parent + 1;
14         if(child!=N-1 && A[child] < A[child + 1 ])
15         {
16             child++;
17         }
18         if(A[child]<=tmp)
19         {
20              break;    
21         }else
22         {
23             A[parent] = A[child];
24         }
25     }
26     A[parent] = tmp;   
27 }
28 void Heap_sort(long a[],int N) 
29 {
30     int i ; 
31     for( i  = N/2;i>=0;i--)
32     {
33         PrecDown(a,i,N); 
34     }
35     for(i = N-1;i>0;i--)
36     {
37         swap(a,0,i);
38         PrecDown(a,0,i);
39     }
40 }
View Code

四:归并排序

 1 void Merge(long A[],long tmpA[],int L,int R,int RightEnd){
 2     // L = 左边元素开始位置 ,R = 右边元素开始位置 ,RightEnd = 右边结束终点位置
 3     int NumSize = RightEnd-L+1; // 元素个数
 4     int LeftEnd = R-1;  // 左边元素终点位置
 5     int tmp = L;  // tmp 数组开始位置
 6     while( L <= LeftEnd && R <= RightEnd ){
 7         if(A[L] <= A[R]) // 从小到大排序,选小的
 8             tmpA[tmp++] = A[L++];
 9         else
10             tmpA[tmp++] = A[R++];
11     }
12     // 也许左没走完
13     while( L <= LeftEnd )
14         tmpA[tmp++] = A[L++];
15     // 也许右边没走完
16     while( R <= RightEnd)
17         tmpA[tmp++] = A[R++];
18     // 再导回 A ,tmp此时已经越界,所以要先减再用
19     for(int i=0;i<NumSize;i++)
20         A[RightEnd--] = tmpA[--tmp];
21 }
22 
23 // 分治
24 void Msort(long A[],long tmpA[],int L,int RightEnd){
25     if(L < RightEnd){
26         int center = ( L + RightEnd )/2;
27         Msort(A,tmpA,L,center);
28         Msort(A,tmpA,center+1,RightEnd);
29         Merge(A,tmpA,L,center+1,RightEnd);
30     }
31 }
32 
33 void Merge_sort(long A[],int N){
34     long tmpA[N];
35     Msort(A,tmpA,0,N-1);
36 }
View Code

五:选择排序

 1 void X_sort(long a[],long n)
 2 {
 3     //选择排序: 就是拿一个数字,比较还有没有比这个数小的,如果有,就交换一下数字
 4     long i , j ;
 5     for( i = 0; i < n;i++)
 6     {
 7         long targer = i;
 8         for(j = i +1;j<n;j++)
 9         {
10             targer = a[targer]>a[j]?j:targer;
11         }
12         swap(a,i,targer);
13     }
14 
15     
16 }
View Code

六:快速排序

 1 void quick_sort(int a[], int L, int R)
 2 {
 3     if(L >= R)
 4     {
 5         return;
 6     }
 7     int x = L,y = R;
 8     int key = a[x];
 9     while(x < y)
10     {
11         while(x < y && a[y]>=key)
12         {
13             y--;
14         }
15         a[x]= a[y];
16         while(x < y && a[x] <= key)
17         {
18             x++;
19         }
20         a[y] = a[x];
21     }
22     a[x] = key;
23     quick_sort(a,L,x-1);
24     quick_sort(a,y+1,R);
25 }
View Code
原文地址:https://www.cnblogs.com/Yzengxin/p/14058167.html