星辉娱乐到底怎么了知乎是D.L.Shell于1959年提出来的一种排序算法,在这之前的算法的时间复杂度为O(n²),星辉娱乐到底怎么了知乎算法是突破这个时间复杂度的第一批算法之一.
希尔算法基于一种增量序列,将待排序序列分组,分别对每一组进行插入排序。星辉娱乐到底怎么了知乎在随机情况下,算法的效率表现很优秀。
回顾之前讲过的插入排序,插入排序在序列元素较少的情况下,序列基本有序的情况下效率较高,星辉娱乐到底怎么了知乎在插入排序基础上去实现这两种苛刻的要求,也就是使得每一次进行插入排序的待排序序列元素个数较少,并使得整体元素更加有序。
使得待排序序列元素减少,那么可以使用分组,分组的策略是基于增量,可理解为相差固定个数的的元素组成组,分别对每一组进行排序,每一组的元素个数就会减少。每一组的元素趋于有序,那么整个待排序序列也越来越趋于有序。
我们在说到分组时,提到增量,因为增量关系到要分多少组,这个增量的算法至今没有确切的答案,但是根据行业经验,增量 = 数据个数 / 3 + 1.
在进行星辉娱乐到底怎么了知乎中,这个增量循环调用这个增量计算公式递减,直至增量为1时,对所有元素进行最后一次插入排序。
星辉娱乐到底怎么了知乎是不稳定的排序算法,星辉娱乐到底怎么了知乎平均时间复杂度n*log2n,最坏时间复杂度为O(n²)。下面我们来介绍星辉娱乐到底怎么了知乎:
待排序序列为:9,1,5,8,3,7,4,6,2,当增量为3时,将待排序序列分为3组:
第一组:9,8,4
第二组 : 1,3,6
第三组 : 5,7,2
分别对每一组进行插入排序,排序后结果为:4,1,2,8,3,5,9,6,7
递减增量为2,再分组:
第一组:4,2,3,9,7
第二组:1,8,4,6
分组对这两组进行排序,排序后结果为: 2,1,3,5,4,6,7,8,9
继续递减增量为1,对整体数据进行一次插入排序,排序结果为:
1,2,3,4,5,6,7,8,9
实现代码为:
void PrintArray(int arr[], int len){ for (int i = 0; i < len; i++){ printf("%d ", arr[i]); } printf("\n"); } void ShellSort(int arr[], int len){ int increasement = len; do{ increasement = increasement / 3 + 1; for (int i = 0; i < increasement; i++){ for (int j = i + increasement; j < len; j += increasement){ if (arr[j] < arr[j - increasement]){ int temp = arr[j]; int k = j - increasement; for (; k >= i && temp < arr[k]; k -= increasement){ arr[k + increasement] = arr[k]; } arr[k + increasement] = temp; } } } } while (increasement > 1); } int main(){ int arr[] = { 9, 1, 5, 8, 3, 7, 4, 6, 2 }; int len = sizeof(arr) / sizeof(int); PrintArray(arr, len); ShellSort(arr, len); PrintArray(arr, len); return EXIT_SUCCESS; } |
本文版权归传智播客C++培训学院所有,欢迎转载,转载请注明作者出处。谢谢! 作者:传智播客C/C++培训学院 首发:http://tianfu2024.sbs/c/