希尔排序
来源:互联网 发布:苹果mac系统更新 编辑:程序博客网 时间:2024/04/29 18:58
希尔排序
插入排序是从第i-1个元素逐次递减到0和第i个元素比较,若当前元素大(小)于第i个元素,当前元素向后移位,否则,退出循环,并且当前元素等于第i个元素。
希尔排序是插入排序的升级,是从第i-gap个元素逐次以gap递减到0,和第i个元素比较,若当前元素大(小)于第i个元素,当前元素向后移位,否则,退出循环,并且当前元素等于第i个元素。由于在排序过程中,采用跳跃式比较和交换(移位),因此希尔排序是不稳定的。
可参考维基百科:https://zh.wikipedia.org/wiki/%E5%B8%8C%E5%B0%94%E6%8E%92%E5%BA%8F
c代码:
void ShellSort (int * const pia, const int n){ int i; int j; int gap = n>>1; // n/2 int temp; while (0 < gap) { for (i=gap; i<n; i++) { temp = pia[i]; // 可以不使用temp,直接用pia[i] for (j=i; (j>gap-1)&&(pia[j-gap]>temp); j-=gap) pia[j] = pia[j-gap]; pia[j] = temp; } gap >>= 1; // gap/2 }}
gap, i和j取值:
gap的取值有说法可参考上面的网址;
在插入排序中,i的初始值是从1开始直到n-1,因为第0个是有序的,在希尔排序中,i初始值从gap开始直到n-1,因为gap的最小值是1而不是0;
j的取值是比较当前和距离gap位置的值,如果小(大)于,则移位,否则退出;
在比较条件满足时,可以采用移位,也可以采用交换(类似冒泡)。
完整c代码:
#include <stdio.h>#include <stdlib.h>#include<windows.h>void ShellSort (int * const pia, const int n){ int i; int j; int gap = n>>1; // n/2 int temp; while (0 < gap) { for (i=gap; i<n; i++) { temp = pia[i]; // 可以不使用temp,直接用pia[i] for (j=i; (j>gap-1)&&(pia[j-gap]>temp); j-=gap) pia[j] = pia[j-gap]; pia[j] = temp; } gap >>= 1; // gap/2 }}int testArray[] = {1,3,5,7,9,2,4,6,8,0};void PrintfIntArray (int * const pia, const int n){ int i; for (i=0; i<n; i++) printf("%u ", pia[i]); printf("\n");}int main(){ DWORD startTime; DWORD endTime; printf("Hello world!\n"); startTime = GetTickCount (); ShellSort (testArray, sizeof(testArray)/sizeof(int)); endTime = GetTickCount(); printf ("Sort Time Consumption:%lu ms.\n", endTime-startTime); PrintfIntArray (testArray, sizeof(testArray)/sizeof(int)); return 0;}
0 0
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 如何在个人主页里插入音乐
- tensorflow 对Recursive NN的完美实现
- PL/SQL标准建表规范
- hdu 2546 饭卡 dp
- <spark>JavaAggregate,自定义数据处理
- 希尔排序
- oracle 常用知识点整理
- 拍照相册和裁剪保存图片集合
- JDBC
- POJ 2955 Brackets (区间DP入门)
- iOS 用XIB约束后,用代码修改约束
- 算法提高 01背包 hdu2602 Bone Collector
- (转载)SpringMVC注解@RequestParam全面解析
- 无根树转为有根树-vector