本章涉及三个排序算法。冒泡排序 、插入排序、合并排序(默认从小到大排)。
1、冒泡排序
是一种较流行的算法。重复交换相邻的反序元素,每一趟冒泡排序后,最大(最小)都被排在n,下一趟再从0到n-1,经过n趟,元素排列完毕。算法复杂度为O(n 2),最优情况(已排好序)需O(n).代码如下:
#include<stdio.h> const int MAX_SIZE = 0xFFFFFF; int test[MAX_SIZE]; int size; void INIT() { int i; scanf("%d ",&size); for(i = 0; i < size; i++) { scanf("%d ",&test[i]); } return; } void BUBBLE_SORT() { int i,j,tmp; for(i = 0; i < size; i++) { for(j = 1; j < size-i; j++) { if(test[j] < test[j-1]) { tmp = test[j-1]; test[j-1] = test[j]; test[j] = tmp; } } } return; } void PRINTF() { int i; for(i = 0; i < size; i++) { printf("%d ",test[i]); } return; } void main () { freopen("input.txt","r",stdin); INIT(); BUBBLE_SORT(); PRINTF(); }
2、插入排序
类似打扑克抓牌是,从1到n开始将牌从一边依次寻找比它小(大),插入该位置,之后的元素都往后移一位。算法复杂度为O(n 2),最优情况(已排好序)需O(n).代码如下:
#include<stdio.h> const int MAX_SIZE = 0xFFFFFF; int test[MAX_SIZE]; int size; void INIT() { int i; scanf("%d ",&size); for(i = 0; i < size; i++) { scanf("%d ",&test[i]); } return; } void INSERTION_SORT() { int i,j,key; for(j = 1; j < size; j++) { key = test[j]; i = j-1; while(i >=0 && test[i] > key) { test[i+1] = test[i]; i--; } test[i+1] = key; } return; } void PRINTF() { int i; for(i = 0; i < size; i++) { printf("%d ",test[i]); } return; } void main () { freopen("input.txt","r",stdin); INIT(); INSERTION_SORT(); PRINTF(); }
3、合并排序
采用分治的策略,将规模为n的待排元素一直二分,分到每堆有2个元素(n为奇数,有一堆为1个元素),然后取每两堆堆元素进行排序到一堆,一直合并到剩一堆。算法复杂度为O(n*logn),最优情况(已排好序)需O(n).代码如下:
#include<stdio.h> const int INF = 0xFFFFFF; const int MAX_SIZE = 0xFFFF; int test[MAX_SIZE]; int left[MAX_SIZE/2 + 1],right[MAX_SIZE/2 + 1]; int size; void INIT() { int i; scanf("%d ",&size); for(i = 0; i < size; i++) { scanf("%d ",&test[i]); } return; } void MERGE(int p, int q, int r) { int i,j,k,n1,n2; n1 = q-p+1; n2 = r-q; for(i = 0; i < n1; i++) { left[i] = test[p+i]; } for(j = 0; j < n2; j++) { right[j] = test[q+j+1]; } left[n1] = INF; // 设置哨兵元素 right[n2] = INF; i = 0; j = 0; for(k = p; k <= r; k++) { if(left[i] <= right[j]) { test[k] = left[i]; i++; } else { test[k] = right[j]; j++; } } return ; } void MERGE_SORT(int p,int r) { int q; if(p < r) { q = (p+r)/2; MERGE_SORT(p,q); MERGE_SORT(q+1,r); MERGE(p,q,r); } return; } void PRINTF() { int i; for(i = 0; i < size; i++) { printf("%d ",test[i]); } return; } void main () { freopen("input.txt","r",stdin); INIT(); MERGE_SORT(0,size-1); PRINTF(); }