void shell_sort(int p[], int len) { int i = 0, j = 0; int gap = len; do { gap = gap/3 + 1; for(i=gap; i<len; i++) { int tmp = p[i]; /*可对比插入排序,插入排序即是 gap = 1的希尔排序*/ for(j=i-gap; (j>=0) && (p[j] > tmp); j -= gap) { p[j+gap] = p[j]; } p[j+gap] = tmp; } }while(gap > 1);
/*采用交换的方式,返回枢轴位置*/ int partition(int p[], int low, int high) { /直接采用第一元素做枢轴,有待优化。详见下文*/ int pv = p[low]; while(low < high) { while(low < high && p[high] >= pv) { high--; } swap(p, low, high); while(low < high && p[low] <= pv) { low++; } swap(p, low, high); } return low; } void q_sort(int p[], int low, int high) { int pv = 0; if(low < high) { /*将传进来的序列一分为二,选出枢轴*/ pv = partition(p, low, high); /*对低值序列进行递归排序*/ q_sort(p, low, pv-1); /*对高值序列进行递归排序*/ q_sort(p, pv+1, high); } } void quick_sort(int p[], int len) { q_sort(p, 0, len-1); }
if( (high - low) > max_length_insert_sort) { /*将传进来的序列一分为二,选出枢轴*/ pv = partition(p, low, high); /*对低值序列进行递归排序*/ q_sort(p, low, pv-1); /*对高值序列进行递归排序*/ q_sort(p, pv+1, high); } else insert_sort(p, len)
void merge(int src[], int des[], int low, int mid, int high) { int i = low; int j = mid + 1; int k = low; while( (i <= mid) && (j <= high) ) { if(src[i] <= src[j]) { des[k++] = src[i++]; } else { des[k++] = src[j++]; } } /*若 i 指向的序列还有剩余,则把剩余的搬过去*/ while(i <= mid) { des[k++] = src[i++]; } /*若 j 指向的序列还有剩余,则把剩余的搬过去*/ while(j <= high) { des[k++] = src[j++]; } }
void m_sort(int src[], int des[], int low, int high, int max) { /*划分到只有一个数据元素的情况 递归划分、归并的终止条件*/ if(low == high) { des[low] = src[low]; } else { int mid = (low + high) / 2; /*辅助空间,每次递归都申请空间的话,消耗有点多*/ int* space = (int*)malloc(sizeof(int) * max); if(space != NULL) { /*容易想到的在第一次划分后,一直是先对划分的左表进行划分、归并、排序*/ m_sort(src, space, low, mid, max); /*之后对第一次划分后的右表进行划分、归并*/ m_sort(src, space, mid+1, high, max); merge(space, des, low, mid, high); } free(space); } }
void merge_sort(int p[], int len) { /*将p数组中的无序序列 归并排序 到p数组中, 中间过程需要使用辅助空间*/ m_sort(p, p, 0, len-1, len); }
原文地址:http://blog.csdn.net/u011467781/article/details/46502057