下面的源代码出来源于我在“西安朱洪计算机培训”学习时的老师之手,马上要找工作了,赶紧复习下,顺便分享下
#include#include #include /************************************************************************//* 插入排序算法思想:考虑打扑克牌时的抓牌过程,从小到大排序, *//* 前面总是已经排序好的,新牌插入到合适的位置。 *//************************************************************************/void insertSort (int *d, int start, int step, int len){ int t, i, j; for (i = start + step; i < len; i += step) { t = d[i]; /* 抽出当前下标元素的值 */ /* 前面总是已排序好的,从已排序好的位置找插入位置,排序稳定 */ for (j = i - step; j >= start && t < d[j]; j -= step) { /* 把比当前值(t)大的元素都向其后移动一个位置,空出位置d[j] */ d[j + step] = d[j]; } /* d[j + step]是一个空位置,要插入的位置 */ d[j + step] = t; }}/************************************************************************//* 希尔排序算法思想:将记录分成若干子序列,子序列数目的分法和 *//* 步长(间隔)有关;子序列按直接插入排序执行排序。 *//************************************************************************/void shellSort (int *d, int len){ int start, step; /* step是步长(间隔),步长越小,子序列数目越少;*/ /* step每改变一次,整个记录就重排序一次 */ for (step = len >> 1; step; step >>= 1) { /* 定位每个子序列的起始下标 */ for (start = 0; start < step; ++start) { /* 子序列按直接插入排序执行排序 */ insertSort(d, start, step, len); } }}void Insert_Example (void){ int i; int arr[7] = { 10, 7, 11, 12, 9, 21, 6}; shellSort(arr, 7); //insertSort(arr, 0, 1, 7); for (i = 0; i < 7; i++) printf("%4d, ", arr[i]); }int main (){ Insert_Example(); return 0;}
直接插入排序:稳定排序;时间复杂度O(n^2)。
希尔排序:不稳定排序,如:{2,4,1,2} 一次排序后为{1,2,2,4};事件复杂度:O(n^1.5)。
posted on 2012-10-08 20:37 阅读( ...) 评论( ...)