个人对希尔排序的理解
- 是将待排序 分成若干的子系列排序(是由相隔的个参数,分割而成)。
- 每次 排序子序列(相隔的参数减少一半)
- 最终 会对全体元素进行一次直接插入排序, 因为在 (元素大部分有序的情况下,直接插入排序效率很高),所以希尔排序时间效率就快
算法 时间复杂度 与 自己想法
- 由于 希尔排序 基于 插入排序的一种算法,当相隔的参数为1,过程就为插入排序。
- 所以 希尔排序 优化点可以根据 实际的情况 和 待排序的元素有序程度。 来单独设计 相隔的参数
- 在 待排序列 有序的情况下 速度很快, 当然在最差的情况下 也比 直接插入排序快。
- 希尔排序的时间复杂度是:O(n^1.2)
- 算法 不稳定
#include <stdio.h>
void shellsort(int a[], int n)
{
int j, gap;
for (gap = n / 2; gap > 0; gap /= 2) //空开几个
for(j = gap; j < n; j++) //扫一遍
if (a[j] < a[j-gap]) //比较 俩
{
int temp = a[j];
int k = j - gap;
while (k >= 0 && a[k] > temp) ///让最小的 移动到最前面
{
a[k + gap] = a[k];
k -= gap;
}
///最小的复制过来
a[k + gap] = temp;
}
}
int main(){
int a[10] = {2,5,6,7,8,9,0,1,3,4};
shellsort(a, 10);
int i ;
for (i = 0; i < 10; i++) {
printf("%d",a[i]);
}
printf("\n");
return 0;
}
-
swift
import UIKit func shellsort(inout a : [Int]){ let n = a.count-1 for(var gap = n / 2; gap > 0; gap /= 2){ for j in gap...n { if a[j] < a[j-gap]{ let tmep = a[j] var k = j - gap while k >= 0 && a[k] > tmep {//扫一遍 好填最小值 a[k + gap] = a[k] k -= gap } a[k + gap] = tmep } } } } var a = [2,5,6,7,8,9,0,1,3,4] shellsort(&a)
-
看我那么可爱n(≧▽≦)n
关注我的微薄 (梁同桌):http://weibo.com/tongrenyinsheng
ios 个人写的app (同人音声)ASMR音乐