欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 游戏 > 希尔排序(Shell_sort)

希尔排序(Shell_sort)

2024/10/24 9:20:26 来源:https://blog.csdn.net/2301_76783671/article/details/139576041  浏览:    关键词:希尔排序(Shell_sort)

希尔排序常用于插入排序的数据预处理,用于提升插入排序的大数据处理速度

将插入排序的函数改为n递增即可使用希尔排序

间隔为n的插入排序:

将i初始值改为1,然后j循环所有的1改为n即可

void Insertion_sort(int *arr,int size,int n)
{int i,j;for(i = 0;i < size;++i)//第一个元素不用排序{int t = arr[i];for(j = i-n;j >= 0 && arr[j] > t;j-=n){arr[j+n] = arr[j];//直接覆盖,速度更快(将前一个覆盖到后面)}arr[j+n] = t;//因为是覆盖,所以要最后赋值}
}

10
3 1 2 8 7 5 9 4 6 0

先以5为间隔

排序为

0 1 2 4 3 5 8 6 9 7

然后以2为间隔

0 1 2 4 3 5 8 6 9 7

最后以1为间隔

0 1 2 3 4 5 6 7 8 9

希尔排序虽然看着多了跟多步,但是在大数据的情况下要比单纯的插入排序快上不少

c++代码如下:

#include <bits/stdc++.h>using namespace std;void print_arr(int *arr,int size)
{for(int i = 0;i < size;++i){cout << arr[i];if(i != size-1){cout << " ";}}
}void Insertion_sort(int *arr,int size,int n)
{int i,j;for(i = 0;i < size;++i)//第一个元素不用排序{int t = arr[i];for(j = i-n;j >= 0 && arr[j] > t;j-=n){arr[j+n] = arr[j];//直接覆盖,速度更快(将前一个覆盖到后面)}arr[j+n] = t;//因为是覆盖,所以要最后赋值}
}void Shell_sort(int *a,int length)
{int n = length/2;while(n >= 1){Insertion_sort(a,length,n);n /= 2;}
}int main()
{int n;cin >> n;int arr[n];for(int i = 0;i < n;++i){cin >> arr[i];}Shell_sort(arr,n);print_arr(arr,n);cout << endl;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com