2021-11-09

本文深入探讨了三种常见的排序算法:冒泡排序、快速排序和希尔排序。冒泡排序通过相邻元素比较交换实现排序;快速排序采用分治策略,以基准元素划分序列;希尔排序则改进了插入排序,通过增量序列优化排序效率。这些算法在不同的场景下有不同的性能表现,对于理解排序原理和优化算法有着重要意义。
摘要由CSDN通过智能技术生成

排序

1

冒泡

双循环

2

快速排序

从数列中挑出一个元素,称为 “基准”(pivot);

重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;

递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;

void quickSort(int left, int right, vector& arr)

{ if(left >= right) return;

int i, j, base, temp; i = left, j = right;

base = arr[left]; //取最左边的数为基准数

while (i < j)

{ while (arr[j] >=(从大到小,从小到大<=) base && i < j) j–;

while (arr[i] <=(从大到小,从小到大<=) base && i < j) i++;

if(i < j)

{ temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; }

} //基准数归位

arr[left] = arr[i];

arr[i] = base;

quickSort(left, i - 1, arr);//递归左边

quickSort(i + 1, right, arr);//递归右边

}

3

希尔排序(快速排序高级版)

选择一个增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1;

按增量序列个数 k,对序列进行 k 趟排序;

每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序。仅增量因子为 1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

#include

using namespace std;

const int INCRGAP = 3;

void shellSort(int a[],int len)

{ int insertNum = 0; unsigned gap = len/INCRGAP + 1; // 步长初始化,注意如果当

len<INCRGAP时,gap为0,所以为了保证进入循环,gap至少为1!!!

while(gap) // while gap>=1

{ for (unsigned i = gap; i < len; ++i) // 分组,在每个子序列中进行插入排序 { insertNum = a[i];//将当前的元素值先存起来方便后面插入

unsigned j = i;

while (j >= gap && insertNum < a[j-gap])//寻找插入位置

{ a[j] = a[j - gap]; j -= gap; } a[j] = insertNum;

} gap = gap/INCRGAP;

}

} int main()

{ int array[11] = {2, 1, 4, 3, 11, 6, 5, 7, 8, 10, 15};

shellSort(array, 11);

for(auto it: array)

{ cout<<it<<endl;

}

return 0;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值