希尔排序有以下的优缺点:
优点:算法较简单,代码短,需要的空间小,速度还可以,适合情况复杂的排序,适合中小规模的排序。
缺点:速度偏慢,不够智能,不适合情况简单的排序,不适合大规模排序。
代码实现和理解:
#include <stdio.h> #include <stdlib.h> /**************************************************************************************** *希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效 * *的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。 * *希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少 * *每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。 * *****************************************************************************************/ /******************************************* *函数名称:Shsort *参数说明:pDataArray 无序数组指针 * iDataNum 无序数据个数 *说明: 希尔排序 ********************************************/ void Shsort(int* pDataArray,int iDateNumn) { int i,j,d; d = iDateNumn / 2; /*确定固定增量值,设为数组长度的一半*/ while(d >= 1) /*增量等于1退出循环*/ { for(i = d;i < iDateNumn;i++) /*数组下标从d开始进行直接插入排序*/ { /*也就是数组的第d+1个元素*/ int temp = pDataArray[i]; /*设置监视哨,元素最右边的位置*/ j = i - d; /*确定要进行比较的元素的最左边位置*/ while((j >= 0) && (temp < pDataArray[j])) /*从后向前,找到比其小的数的位置*/ { pDataArray[j + d] = pDataArray[j]; /*数据右移*/ j -= d; /*向左移动d个位置*/ } if (j != i - d) /*存在比其小的数*/ pDataArray[j + d] = temp; /*在确定的位置插入pDataArray[i]*/ } d = d / 2; } } /******************************************* *函数名称:main *参数说明:无 *说明: 主函数 ********************************************/ void main(void) { int pDataArray[10],i; printf("请输入10个数据:\n"); for(i = 0;i < 10;i++) scanf("%d",&pDataArray[i]); Shsort(pDataArray,10); printf("排序后的顺序是:\n"); for(i = 0;i < 10;i++) printf("%5d",pDataArray[i]); printf("\n"); system("pause"); }