本文将介绍七大排序算法的三种,其中另外四种见博客冒泡排序、选择排序、插入排序、堆排序,其中本文用到的两个数的交换函数也在该博客中有介绍。
1.希尔排序
(1)实现思想:

(2)时间复杂度:取决于步长序列,若使用希尔序列:N/2,N/4,N/8.......1,时间复杂度为O(n^2);若选择一个最优序列,可达到O(n^1.3)
(3)空间复杂度:O(1)
(4)稳定性:不稳定排序
(5)实现代码:
//5.希尔排序:分组式的插入排序
//定义一个初始步长(下标间隔)gap,按步长将待排序数列分组
//将分好的组,每组插入排序,然后gap--
//重复以上步骤,直至gap=0
//N/2,N/4,N/8...希尔序列,时间复杂度为O(N)
void ShellSort(int arr[], size_t size)
{
if(size <= 1)
return;
int64_t gap = size/2;//使用希尔序列
//1.第一重循环,生成步长序列
for(; gap>0; gap /= 2)
{
//2.第二重循环,进入插入排序
//此循环的执行顺序,相当于先处理第一组的第一个
//再处理第二组的第一个....
//再第二组的第一个....
int64_t bound = gap;//此处相当于插入排序中的bound=1
for(; bound<size;++bound)
{
int bound_value = arr[bound];//待插入元素
//3.第三重循环,线性表的搬运(一边找一边搬运)
int64_t cur = bound;
for(; cur>=gap;cur -= gap)//cur-=gap是为了找到同组元素的上一个元素
{
if(arr[cur-gap] > bound_value)//进行搬运
arr[cur] = arr[cur-gap];
else//找到了合适的插入位置
break;
}
arr[cur] = bound_value;
}
}
}
2. 归并排序
(1)实现思想:

本文主要介绍了希尔排序、归并排序和快速排序的实现思想、时间复杂度、空间复杂度及稳定性。希尔排序的时间复杂度在最优情况下为O(n^1.3),归并排序稳定且时间复杂度为O(n^logn),快速排序在平均情况下时间复杂度为O(n^logn)。此外,还提到了快速排序的改进方法,包括调整基准值选取和在小规模时转为插入排序。
最低0.47元/天 解锁文章
705

被折叠的 条评论
为什么被折叠?



