云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > 四种简单的排序算法C++

四种简单的排序算法C++

  • 62 次阅读
  • 3 次下载
  • 2026/4/26 17:46:17

可以看到,尽管比较的趟数没有减少,但是交换的次数却明显很少。希尔排序的总体想法就是先让数组基本有序,最后再应用插入排序。具体过程如下:假设有数组int a[] = {42,20,17,13,28,14,23,15},不失一般性,我们设其长度为length。

第一趟时,步长step = length/2 = 4,将数组分为4组,每组2个记录,则下标分别为(0,4)(1,5)(2,6)(3,7);转换为数值,则为{42,28}, {20,14}, {17,23}, {13,15}。然后对每个分组进行插入排序,之后分组数值为{28,42}, {14,20}, {17,23}, {13,15},而实际的原数组的值就变成了{28,14,17,13,42,20,23,15}。这里要注意的是分组中记录在原数组中的位置,以第2个分组{14,20}来说,它的下标是(1,5),所以这两个记录在原数组的下标分别为a[1]=14;a[5]=20。

第二趟时,步长 step = step/2 = 2,将数组分为2组,每组4个记录,则下标分别为(0,2,4,6)(1,3,5,7);转换为数值,则为{28,17,42,23}, {14,13,20,15},然后对每个分组进行插入排序,得到{17,23,28,42}{13,14,15,20}。此时数组就成了{17,13,23,14,28,15,42,20},已经基本有序。

第三趟时,步长 step=step/2 = 1,此时相当进行一次完整的插入排序,得到最终结果{13,14,15,17,20,23,28,42}。

算法实现(C#)

// 希尔排序

public static void ShellSort(T[] array, C comparer) where C : IComparer {

for (int i = array.Length / 2; i >= 1; i = i / 2) { Console.Write(\, i); for (int j = 0; j < i; j++) {

InsertSort(array, j, i, comparer); }

Console.WriteLine();

AlgorithmHelper.PrintArray(array); } }

// 用于希尔排序的插入排序

private static void InsertSort

(T[] array, int startIndex, int step, C comparer) where C : IComparer {

for (int i = startIndex + step; i <= array.Length - 1; i += step) {

int j = i;

while(j>= step && comparer.Compare(array[j], array[j - step]) <0 ){

swap(ref array[j], ref array[j - step]); j -= step; } } }

注意这里插入排序InsertSort()方法的参数,startIndex是分组的起始索引,step是步长,可以看出,前面的插入排序只是此处step=1,startindex=0的一个特例。

输出演示(C#)

static void Main(string[] args) {

int[] array = {42,20,17,13,28,14,23,15}; AlgorithmHelper.PrintArray(array);

SortAlgorithm.ShellSort

(array, ComparerFactory.GetIntComparer()); }

算法实现(C++)

// 希尔排序

template

void ShellSort(T a[], int length){

for(int i = length/2; i >= 1; i = i/2 ){ for(int j = 0; j

InsertSort(&a[j], length-1, i); } } }

// 用于希尔排序的插入排序

template

void InsertSort(T a[], int length, int step){ for(int i = step; i

while(j>=step && C::Smaller(a[j], a[j-step])){ swap(a[j], a[j-step]); j-=step; }

} }

对于上面三种算法的代价,插入排序、冒泡排序、选择排序,都是Θ(n2),而希尔排序略好一些,是Θ(n1.5),关于算法分析,大家感兴趣可以参考相关书籍。这里推荐《数据结构与算法分析(C++版)第二版》和《算法I~IV(C++实现)——基础、数据结构、排序和搜索》,都很不错,我主要也是参考这两本书。

感谢阅读,希望这篇文章可以给你带来帮助。

搜索更多关于: 四种简单的排序算法C++ 的文档
  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

可以看到,尽管比较的趟数没有减少,但是交换的次数却明显很少。希尔排序的总体想法就是先让数组基本有序,最后再应用插入排序。具体过程如下:假设有数组int a[] = {42,20,17,13,28,14,23,15},不失一般性,我们设其长度为length。 第一趟时,步长step = length/2 = 4,将数组分为4组,每组2个记录,则下标分别为(0,4)(1,5)(2,6)(3,7);转换为数值,则为{42,28}, {20,14}, {17,23}, {13,15}。然后对每个分组进行插入排序,之后分组数值为{28,42}, {14,20}, {17,23}, {13,15},而实际的原数组的值就变成了{28,14,17,13,42,20,23,15}。这里要注意的是分组中记录在原数组中的位置,以第2个分组{14,20}来说,它的下标是(1,5

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com