标签:情况下 fonts 逆序 技术 efi while type alt for
希尔排序(Shell Sort)是基于插入排序的一种不稳定排序方法。
1,将整个序列分为h个子序列;
2,第一趟将每个子序列进行插入排序;
3,第二趟将增量缩小,重复2;
4,直至增量为1,就是简单插入排序。
eg:
#include <stdio.h>
#define MAXSIZE 100
typedef struct
{
int a[MAXSIZE + 1]; //a[1]~a[MAXSIZE]存储元素
int length;
}Sqlist;
/*升序排列*/
void Shell_Sort(Sqlist* L)
{
int h = 1;
while (h < L->length / 3)
h = 3 * h + 1; //增量取值
while (h >= 1)
{
//从增量的那组进行插入排序
for (int i = h; i <= L->length; i++)
{
int j = i;
int get = L->a[j];
//同组元素中与其前一个比较
while (j - h >= 0 && L->a[j - h] > get)
{
L->a[j] = L->a[j - h];
j = j - h;
}
L->a[j] = get;
}
h = h / 3;
}
}
int main(int argc, char** argv)
{
Sqlist L;
scanf("%d", &(L.length));
for (int i = 1; i <= L.length; i++)
scanf("%d", &(L.a[i]));
Shell_Sort(&L);
for (int i = 1; i <= L.length; i++)
printf("%d ", L.a[i]);
printf("\n");
return 0;
}
希尔排序最优时间复杂度\(O(n)\),最差情况下也突破了平方级别的运行时间。
对于最差情况,之前的冒泡、选择要消除逆序,采用交换相邻元素的方法,也就是每次只能消除一个逆序,那么希尔每次交换隔得很远的元素,每次可以消除多个逆序,这样就节省了大量的交换时间。
标签:情况下 fonts 逆序 技术 efi while type alt for
原文地址:https://www.cnblogs.com/EIMadrigal/p/12130405.html