#include<stdio.h>
#include<stdlib.h>
void show(int *arr,int sum)
{
for (int i = 0; i < sum; i++)
printf("%d,", arr[i]);
printf("\n");
}
//希尔排序
void shellSorta(int * arr, int sum)//在插入排序的基础上增加一个增量,将增量的记录组成一个子序,再进行排序
/*arr[10] = { 0,9,1,5,8,3,7,4,6,2 };
increment为4时
{9,3,2}为1组 所以(比较9-2的时候,2要插入到3的前面
{1,7}为1组
{5,4}为1组
{8,6}为1组
increment为2时
{2,4,3,5,9}为一组
{1,6,7,8}为一组
increment为1时
{2,1,3,6,4,7,5,8,9}为一组
*/
/*理解难点是:刚开始进行希尔排序的时候,因为增量是一半,每一组的元素只有两个,这个时候,
仅仅是交换元素位置就可以(会让人误以为是交换排序)。但是随着增量的不断减少,每组的元素数量开始变多,这
个时候,每移动一个元素,就需要对数组的部分元素进行右移(因为数组)。*/
{
int i, j;
int increment = sum;//设置增量
do
{
increment = increment / 3 + 1;
printf("increment:增量为%d时\n", increment);
for (i = increment + 1; i <=sum; i++)//根据增量进行插入排序
{
if (arr[i] < arr[i - increment])
{
arr[0] = arr[i];
for (j = i - increment ; j > 0 && arr[0] < arr[j]; j = j - increment)
arr[j + increment] = arr[j];
show(arr, 10);
arr[j + increment] = arr[0];
}
show(arr, 10);
}
printf("\n\n");
} while (increment > 1);
}
void main()
{
int arr[10] = { 0,9,1,5,8,3,7,4,6,2 };
show(arr, 10);
shellSorta(arr,9);
printf("希尔排序:");
show(arr+1, 9);
system("pause");
}
数据结构-排序-shellsort希尔排序
最新推荐文章于 2021-12-07 16:05:12 发布