插入排序

来源:互联网 发布:淘宝网购平板电脑 编辑:程序博客网 时间:2024/05/17 04:49
//插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。 //直接查找排序void direct_sort(int* list,int lenth){for(int i=1;i<lenth;i++)//循环从第2个元素开始{if(list[i]>list[i-1]){int temp=list[i]; //哨兵int j = 0;for(j=i-1;j>=0 && list[j]<temp;j--)//list[j]<temp 防止越界哨兵{//直接插入排序从尾结点边比较边移动元素,//而并非等找到插入点后再移动元素.所以从尾结点开始向头结点找插入点则效率更好.//符合要求的有序数组后移一位list[j+1]=list[j];}list[j+1]=temp;//哨兵保存了list[i]的副本,使不致于因记录后移而丢失list[i]的内容;}printf("第%d趟:",i);for (int i = 0; i< lenth; i++){printf("%d  ",list[i]);}printf("\n");}}//半分查找排序void binary_search_sort(int* list,int lenth){int outer, inner;//outer loopfor (outer = 1; outer < lenth; outer++){int temp = list[outer]; ////哨兵int low = 0, high = outer;  //已经排好序的数组的上下界//在已经排好序的的数组中进行半分查找while (low <= high){int mid = (low + high) / 2; //折半数组if (temp < list[mid])low = mid + 1;   //需要插入的数组在右边elsehigh = mid - 1;  //需要插入的数组在左边}//右边的数组右移一位for (int j = outer - 1; j > high; j--){list[j + 1] = list[j];}//将待排序组插入list[high + 1] = temp;printf("第%d趟:",outer);for (int i = 0; i< lenth; i++){printf("%d  ",list[i]);}printf("\n");}}//希尔排序的基本思想是://把记录按步长 gap 分组,对每组记录采用直接插入排序方法进行排序。//随着步长逐渐减小,所分成的组包含的记录越来越多,当步长的值减小到 1 时,整个数据合成为一组,构成一组有序记录,则完成排序。void shell_sort(int* list,int lenth){int gap = lenth / 2;int i = 0;while (1 <= gap) {// 把距离为 gap 的元素编为一个组,扫描所有组for (int i = gap; i < lenth; i++){int j = 0;int temp = list[i];//哨兵// 对距离为 gap 的元素组进行直接插入排序for (j = i - gap; j >= 0 && temp < list[j]; j = j - gap) {list[j + gap] = list[j];}list[j + gap] = temp; //哨兵保存了list[i]的副本,使不致于因记录后移而丢失list[i]的内容;}printf("第%d趟:",i);for (int i = 0; i< lenth; i++){printf("%d  ",list[i]);}printf("\n");gap = gap / 2; // 减小增量i++;}}

0 0
原创粉丝点击