希尔排序:将无序数组分割为若干个子序列,子序列不是逐段分割的,而是相隔特定的增量的子序列,对各个子序列进行插入排序;然后再选择一个更小的增量,再将数组分割为多个子序列进行排序......最后选择增量为1,即使用直接插入排序,使最终数组成为有序。
- /********************************************************
- *函数名称:ShellInsert
- *参数说明:pDataArray 无序数组;
- * d 增量大小
- * iDataNum为无序数据个数
- *说明: 希尔按增量d的插入排序
- *********************************************************/
- void ShellInsert(int* pDataArray, int d, int iDataNum)
- {
- for (int i = d; i < iDataNum; i += 1) //从第2个数据开始插入
- {
- int j = i - d;
- int temp = pDataArray[i]; //记录要插入的数据
- while (j >= 0 && pDataArray[j] > temp) //从后向前,找到比其小的数的位置
- {
- pDataArray[j+d] = pDataArray[j]; //向后挪动
- j -= d;
- }
- if (j != i - d) //存在比其小的数
- pDataArray[j+d] = temp;
- }
- }
- /********************************************************
- *函数名称:ShellSort
- *参数说明:pDataArray 无序数组;
- * iDataNum为无序数据个数
- *说明: 希尔排序
- *********************************************************/
- void ShellSort(int* pDataArray, int iDataNum)
- {
- int d = iDataNum / 2; //初始增量设为数组长度的一半
- while(d >= 1)
- {
- ShellInsert(pDataArray, d, iDataNum);
- d = d / 2; //每次增量变为上次的二分之一
- }
- }
复制代码
|
|