希尔排序(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
- 希尔排序(C语言版)
- 希尔排序c语言版
- 希尔排序 C语言版
- 希尔排序(C语言版)
- 经典排序——希尔排序——C语言版
- 排序算法 C语言版
- 快速排序C语言版
- 归并排序 --- C语言版
- 快速排序C语言版
- 归并排序C语言版
- 选择排序(C语言版)
- 归并排序(C语言版)
- 计数排序(C语言版)
- 堆排序(C语言版)
- 快速排序C语言版
- 冒泡排序 C语言版
- 快速排序 C语言版
- 堆排序 C语言版
- 第三方斯蒂芬身份是深深的说的
- 安卓初学记-问题1
- UVA 10453 - Make Palindrome
- 规范和法国和发给发给发给发给发给发发发过火
- Xcode插件 XAlign:用于代码对齐的Xcode插件
- 希尔排序(C语言版)
- 第7周项目2电阻并联
- 家客户家客户机回家 合格后刚好韩国激光焊接
- Ubuntu 12.04 -python 2.7 安装Eric4和gensim
- 啊急啊急啊急啊分
- USM
- 走注撞锥子宗柞拙紫捉紫拽撰椎左阻孜族
- Unable to add window -- token null is not for an application
- SDUTOJ 2766 小明传奇2