希尔排序(C语言版)

来源:互联网 发布:用友nc6.5数据库 编辑:程序博客网 时间:2024/05/22 08:07

先说说希尔排序的思想:希尔排序是对直接插入排序的改进版,又叫增量排序。

       先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。

稳定性和复杂度:

       希尔排序是不稳定的排序算法;希尔排序的时间复杂度取决于你所采用的增量序列,典型的增量序列是shell增量序列和Hibbard增量序列,它们的时间复杂度分别是O(n2)和O(n3/2)(3/2表示二分之三次方);空间复杂度为O(1)。
       下面是我用C语言实现的希尔排序,采用的增量序列是N/2,N/4,N/8,......,1;如果有什么错误请大家指出,谢谢。

#include <stdio.h>#include <assert.h>#include <stdlib.h>#include <time.h>void getRandArray(int array[], int size);void shellSort(int array[], int size);void shellPass(int array[], int size, int increment);void printArray(int array[], int size);void isSorted(int array[], int size);int main(int argc, char const *argv[]){    int size = 0;    scanf("%d", &size);    assert(size > 0);    int *array = (int *)calloc(size, sizeof(int));    getRandArray(array, size);    printArray(array, size);    shellSort(array, size);    printArray(array, size);    isSorted(array, size);    free(array);    return 0;}//利用伪随机数填充数组arrayvoid getRandArray(int array[], int size){    assert(array != NULL && size > 0);    srand((unsigned) time(NULL));    int i = 0;    for (i = 0; i < size; ++i) {        //产生100以内的伪随机数        array[i] = rand() % 100;    }}//从小到大排序void shellSort(int array[], int size){    assert(array != NULL && size > 0);    int increment = size;    do {        shellPass(array, size, increment);        increment /= 2;    } while (increment != 0);}//一趟希尔排序,利用直接插入排序的思想进行处理void shellPass(int array[], int size, int increment){    assert(array != NULL && size > 0);    int insertVal = 0;    int i = 0;    int j = 0;    for (i = increment; i < size; ++i) {        insertVal = array[i];        j = i - increment;        if (array[j] > insertVal) {            while (0 <= j && insertVal < array[j]) {                array[j + increment] = array[j];                j -= increment;            }            array[j + increment] = insertVal;        }    }}void printArray(int array[], int size){    assert(array != NULL && size > 0);    int i = 0;    for (i = 0; i < size; ++i) {        printf("%d ", array[i]);    }    printf("\n");}//判断数组array是否已经是有序的void isSorted(int array[], int size){    assert(array != NULL && size > 0);        int unsorted = 0;    int i = 0;    for (i = 1; i < size; ++i) {        if (array[i] < array[i - 1]) {            unsorted = 1;            break;        }    }    if (unsorted) {    printf("the array is unsorted!\n");    } else {    printf("the array is sorted!\n");    }}

其他八种排序算法的博客:

常见的9种内部排序(C语言实现)



0 0
原创粉丝点击