shell sort

/**希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。

*该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。

*

*以n=10的一个数组49, 38, 65, 97, 26, 13, 27, 49, 55, 4为例

第一次 gap = 10 / 2 = 5

49   38   65   97   26   13   27   49   55    4

1A                                1B

2A                                  2B

3A                                     3B

4A                                     4B

5A                                        5B

1A,1B,2A,2B等为分组标记,数字相同的表示在同一组,大写字母表示是该组的第几个元素,
每次对同一组的数据进行直接插入排序。即分成了五组(49, 13) (38, 27) (65, 49)  (97, 55)  (26, 4)这样每组排序后就变成了(13, 49)  (27, 38)  (49, 65)  (55, 97)  (4, 26),下同。

第二次 gap = 5 / 2 = 2

排序后

13   27   49   55   4    49   38   65   97   26

1A         1B          1C          1D         1E

2A          2B           2C           2D         2E

第三次 gap = 2 / 2 = 1

4   26   13   27   38    49   49   55   97   65

1A  1B   1C   1D   1E    1F   1G   1H   1I   1J

第四次 gap = 1 / 2 = 0 排序完成得到数组:

4   13   26   27   38    49   49   55   65   97

*

*/

//下面给出严格按照定义来写的希尔排序 
低级

void shell_sort_low(int unsorted[],
int count)

{

//    int i, j, gap;

//    for (gap = count / 2; gap > 0; gap /= 2) { //步长

//        for (i = 0; i < gap; i++) {        //直接插入排序

//            for (j = i + gap; j < count; j += gap) {

//                if (unsorted[j] < unsorted[j - gap]) {

//                    int temp = unsorted[j];

//                    int k = j - gap;

//                    while (k >= 0 && unsorted[k] > temp) {

//                        unsorted[k + gap] = unsorted[k];

//                        k -= gap;

//                    }

//                    unsorted[k + gap] = temp;

//                }

//            }

//        }

//    }

for (int gap = count/2; gap >
0; gap /= 2) { //步长  //直接插入排序的次数

for (int arrayCount =
0; arrayCount < gap; arrayCount++) { //分组后数组的个数, (数组的个数 = gap)

for (int index = arrayCount + gap; index < count; index += gap) {

if (unsorted[index] < unsorted[index-gap]) {

int temp = unsorted[index];

int k = index - gap;

while (k >=
0 && unsorted[k] > temp) {

unsorted[k+gap] = unsorted[k];

k -= gap;

}

unsorted[k+gap] = temp;

}

}

}

}

}

//中级 进行改进和优化,以第二次排序为例,原来是每次从1A到1E,从2A到2E,可以改成从1B开始,先和1A比较,然后取2B与2A比较,再取1C与前面自己组内的数据比较…….。这种每次从数组第gap个元素开始,每个元素与自己组内的数据进行直接插入排序显然也是正确的。

void shell_sort_middle(int unsorted[],
int count)

{

for (int gap = count /
2; gap > 0; gap /=
2) {

for (int j = gap; j < count; j++) { 
//从数组第gap个元素开始

if (unsorted[j] < unsorted[j - gap]) {//每个元素与自己组内的数据进行直接插入排序

int temp = unsorted[j];

int k = j - gap;

while (k >=
0 && unsorted[k] > temp) {

unsorted[k + gap] = unsorted[k];

k -= gap;

}

unsorted[k+gap] = temp;

}

}

}

}

//高级

void shell_sort_high(int unsorted[],
int count)

{

for (int gap = count /
2; gap > 0; gap /=
2) {

for (int i = gap; i < count; i++) {

for (int j = i - gap; j >=
0 && unsorted[j] > unsorted[j + gap]; j -= gap) {

swap(&unsorted[j], &unsorted[j + gap]);

}

}

}

}

int main(int argc,
const char * argv[])

{

//int unsorted[] = { 6, 2, 4, 1, 5, 3, 7, 8, 9, 10, 11};

//selection_sort(x, 11);

//bubble_sort_low(unsorted, 11);

//bubble_sort_middle(unsorted, 11);

//bubble_sort_high(unsorted, 11);

//insertion_sort_low(unsorted, 11);

//insertion_sort_middle(unsorted, 11);

//insertion_sort_high(unsorted, 11);

int unsorted[] = {49,
38, 65, 97,
26, 13, 27,
49, 55, 4};

//shell_sort_low(unsorted, 10);

//shell_sort_middle(unsorted, 10);

shell_sort_high(unsorted,
10);

for (int index =
0; index<10; index++) {

printf("%d ",unsorted[index]);

}

printf("\n");

}

shell sort,布布扣,bubuko.com

时间: 2024-07-30 10:21:13

shell sort的相关文章

Linux Shell sort 指定排序第几列

ip.txt 里存储着ip信息 统计排序后取前10条 awk '{cnt[$1]++} END{for (ip in cnt) print ip":"cnt[ip]}' ip.txt | sort -k 2 -rn -t":" | head -n 10 awk '{cnt[$1]++} END{for (ip in cnt) print cnt[ip],ip}' ip.txt | sort -rn | head -n 10 sort -k  根据第几列排序  -n

希尔排序Shell sort

希尔排序Shell Sort是基于插入排序的一种改进,同样分成两部分, 第一部分,希尔排序介绍 第二部分,如何选取关键字,选取关键字是希尔排序的关键 第一块希尔排序介绍 准备待排数组[6 2 4 1 5 9] 首先需要选取关键字,例如关键是3和1(第一步分成三组,第二步分成一组),那么待排数组分成了以下三个虚拟组: [6 1]一组 [2 5]二组 [4 9]三组 看仔细啊,不是临近的两个数字分组,而是3(分成了三组)的倍数的数字分成了一组, 就是每隔3个数取一个,每隔三个再取一个,这样取出来的数

Shell Sort based on insert sort

Reason:when it comes to insert sort,the snail appears,as it just moves forward step by step or even worse.So we need some improvement.the first idea may be that we can walk forward in big strides.Shell sort do the same thing. the basic realization(fo

[算法] shell sort

public void sort(int[] list) { int gap = list.length / 2; while (1 <= gap) { for (int i = gap; i < list.length; i++) { int j = 0; int temp = list[i]; for (j = i - gap; j >= 0 && temp < list[j]; j = j - gap) { list[j + gap] = list[j]; }

希尔排序(Shell Sort)

1.定义 希尔排序(Shell Sort)是插入排序的一种.因D.L.Shell于1959年提出而得名. 2.基本思想 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组.所有距离为dl的倍数的记录放在同一个组中.先在各组内进行直接插人排序:然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止. 该方法实质上是一种分组插入方法. 3.Shell排序算法实现 (1

Shell Sort(希尔排序)

近日学习了Shell Sort,也就是希尔排序,也称递减增量排序算法.在1959年由DL.Shell提出于1959年提出,由此得名. 此版本算法是在插入排序(Insertion Sort)基础上,将数组分成了h份(gap).也就是在数组中每隔h个数取出一个数,为一个子数组.先在子数组上进行排序,然后不断减小h的大小,直到h == 1 时,也就是完全变成插入排序的时候,排序完成. 算法复杂度取决于h(步长/步进)的选择,在最差的时候,也就是h == 1的时候,希尔排序就变成了插入排序,复杂度为O(

经典排序算法 - 希尔排序Shell sort

经典排序算法 - 希尔排序Shell sort 希尔排序Shell Sort是基于插入排序的一种改进,同样分成两部分, 第一部分,希尔排序介绍 第二部分,如何选取关键字,选取关键字是希尔排序的关键 第一块希尔排序介绍 准备待排数组[6 2 4 1 5 9] 首先需要选取关键字,例如关键是3和1(第一步分成三组,第二步分成一组),那么待排数组分成了以下三个虚拟组: [6 1]一组 [2 5]二组 [4 9]三组 看仔细啊,不是临近的两个数字分组,而是3(分成了三组)的倍数的数字分成了一组, 就是每

希尔排序 Shell Sort

希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进.该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. 希尔排序实质上是一种分组插入方法.它的基本思想是:对于n个待排序的数列,取一个小于n的整数gap(gap被称为步长)将待排序元素分成若干个组子序列,所有距离为gap的倍数的记录放在同一个组中:然后,对各组内的元素进行直接插入排序. 这一趟排序完成之后,每一个组的元素都是有序的.然后减小gap的值,并重复执行上述的分组和排序.重复这样的操作,当gap

转载 shell sort

http://blog.sina.com.cn/s/blog_6d09b5750100x6zg.html 首先是shell排序实现多列排序,这里添加竖线以作分割,如下文件test: a|gggg|4|7 b|fff2|3|2 c|gea0|6|12 d|kkkg|4|11 e|uity|6|4 f|fger|1|3 g|wabg|7|5 h|zhag|8|7 i|hang|3|3 j|lang|2|15 k|long|5|7 $cat test |sed 's/|/ /g' |sort -k3,