开始学数据结构——(六):希尔排序
来源:互联网 发布:超级淘宝系统悟有所得 编辑:程序博客网 时间:2024/06/09 14:49
好久没有写关于数据结构的笔记了,快校招了,得补补,面试或许有用的。
下面讲希尔排序,作为简单插入排序的改进:
先讲下思路: 挺简单的。 简单插入排序,就是后面的数来的从后面开始比较,只要<前面的数,就将前面的数往后移动一位,直到不能移动为止,则是要插入的地方。
****为何出了希尔排序呢,上面的思路挺容易忽略一个简单的事实,那就是我们都是从后面的数和前面的一个数开始比较,这里步长是1. 如果不长不是1 呢。那就是我们的希尔排序,希尔排序就是假定一个步长,然后调用简单插入排序,然后这个步长慢慢减小,直到为1. 那么就OK了。 ******
#include<stdio.h>#include<unistd.h>void print(int a[], int n ){ int j; for(j= 0; j<n; j++) printf("%d",a[j]); printf("\n"); } /** * 直接插入排序的一般形式 * * @param int dk 缩小增量,如果是直接插入排序,dk=1 * */ void ShellInsertSort(int a[], int n, int dk) { int i ,j ,x; for(i= dk; i<n; ++i){ if(a[i] < a[i-dk]){ //若第i个元素大于i-1元素,直接插入。小于的话,移动有序表后插入 j = i-dk; //后面的数小于前面的数,那么就递归交换这两个数的位置,而前面的数的位置是 i-dk x = a[i]; //x就是后面的数,但是不一定就是放在 i-dk的位置上,还需要比较,所以暂时保存下来 a[i] = a[i-dk]; //但是后面的数却可以立即的保存下来而不需要再次比较了。 while(x < a[j-dk] && ((j-dk)>=0) ){ //查找在有序表的插入位置 如果比以前的数还小,那么就一直的递归比较。 a[j] = a[j-dk]; j -= dk; //元素后移 } a[j] = x; //插入到正确位置 } } print(a, n); } /** * 先按增量d(n/2,n为要排序数的个数进行希尔排序 * */ void shellSort(int a[], int n){ int dk = n/2; while( dk >= 1 ){ ShellInsertSort(a, n, dk); dk = dk/2; } } int main(){ int a[] = {3,1,5,7,2,4,9,6,1,2,3,6,5,4,7,8,9,6,3,2,1,0,0,0,0,98,96,97,100}; //ShellInsertSort(a,8,1); //直接插入排序 shellSort(a,sizeof(a)/sizeof(a[0]) ); //希尔插入排序 return 0;}
0 0
- 开始学数据结构——(六):希尔排序
- 开始学数据结构——(六):快速排序
- 从零开始_学_数据结构(六)——排序(冒泡、插入、希尔、简单选择、归并、快速)
- 数据结构—希尔排序
- 数据结构 — 希尔排序
- 开始学数据结构——(一):选择排序
- 开始学数据结构——(二):冒泡排序
- 开始学数据结构——(三):插入排序
- 开始学数据结构——(一):选择排序
- 开始学数据结构——(二):冒泡排序
- 开始学数据结构——(三):插入排序
- 开始学数据结构——(四):归并排序
- 数据结构——希尔排序(c++)
- 数据结构——希尔排序
- 排序算法(六)——希尔排序
- 排序算法(六)——希尔排序
- 排序算法(六)——希尔排序
- 希尔排序(六)
- 论坛热点发现系统
- C 语言学习
- 表驱动编程简介
- Minimum Inversion Number(线段树)
- 剑指offer 6.5 发散思维 - 不能被继承的类
- 开始学数据结构——(六):希尔排序
- jquery解析xml字符串示例分享
- java 中import static *** 失败的总结
- __set/__get触发条件
- 列表的展开与闭合
- java设计模式之装饰器模式
- RGB,YUV的来历及其相互转换
- 让他一人同意让他一人同意让他一人同意让他一人同意让他一人统一
- 关于MappedByteBuffer资源释放问题