算法之排序
一:冒泡排序
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 }
二:插入排序
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 }
三:堆排序
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 }
四:归并排序
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 }
五:选择排序
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 }
六:快速排序
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 }