C实例---插入排序(Shell)

来源:互联网 发布:html5 720度全景源码 编辑:程序博客网 时间:2024/05/16 06:45

问题描述:简单插入排序的时间复杂度是:n^2,shell排序是对其时间复杂度改进的一种算法,改善后的复杂度为:nlogn
分析:待排数据 99 42 57 74 46 85 32 78 40 33 74 88 65 27 38 69 51 32 59 24
对其进行一次划分:
d = 20 / 2 = 10 :99 42 57 74 46 85 32 78 40 33 | 74 88 65 27 38 69 51 32 59 24
99 与 74 进行简单选择排序,42与88 ……..
对划分的序列进行简单选择排序,直到d = 1为止。
一趟排序的结果:74 42 57 27 38 69 32 32 40 24 | 99 88 65 74 46 85 51 78 59 33
各趟的排序过程见运行结果。
代码:

#include <stdio.h>void ShellSort(int s[], int len){    int i,j,d,key = 0;    d = len / 2;    while (d >= 1)    {        for (i = d; i < len; i ++)   //划分一次进行一次简单选择排序        {            key = s[i];            j = i - d;            while (j >=0 && s[j] > key)            {                s[j + d] = s[j];                j -= d;            }            s[j + d] = key;        }        printf("d = %.2d: ",d);        for (i = 0; i < len; i ++)        {            for (i = 0; i < len; i ++)                if (d > 0 && (i + 1) % d == 0)                    printf("%d | ",s[i]);                else                    printf("%d ",s[i]);        }        printf("\n");        d /= 2;    }}int main (){    int a[20] = {99,42,57,74,46,85,32,78,40,33,74,88,65,27,38,69,51,32,59,24};    //int a[5] = {5,4,3,2,1};    int i;    printf("待排序列:");    for (i = 0; i < 20; i ++)    {        if ((i + 1) % 10 == 0)            printf("%d | ",a[i]);        else            printf("%d ",a[i]);    }    printf("\n");    ShellSort(a, 20);    printf("排序结果: ");    for (i = 0; i < 20; i ++)        printf("%d ",a[i]);    printf("\n");    return 0;}

运行结果:
这里写图片描述

简单插入排序:http://blog.csdn.net/huazhen1234/article/details/53894004
随机生成测试数组:http://blog.csdn.net/huazhen1234/article/details/53896153

0 0
原创粉丝点击