1. 程式人生 > 實用技巧 >演算法之排序

演算法之排序

一:氣泡排序

 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