希尔排序算法的C++实现

算法描述

希尔排序是基于插入排序的思想,又被称为缩小增量排序。把数组按一定增量d分组,对每组记录采用直接插入排序方法进行排序,随着增量逐渐减小,所分成的组包含的记录越来越多,到增量的值减小到1时,整个数据合成一组有序的序列。

算法执行过程

1.将有n个元素的数组分成n/2个数字序列,第1个数据和第n/2+1个数据为一组,第2个数据和第n/2+2个数据为一组… 2.一次循环使每一组序列排好顺序。 3.将n个元素的数组分为n/4个数字序列,再次排序。 4.不断重复,当序列变为一组时,完成排序。

C++代码

#include <iostream>
using namespace std;
#define SIZE 10
void shellSort(int arr[], int len)
{
          
   
	int i, j, h, r, temp;
	int x = 0;
	cout << "排序之前数组序列为: ";
	for (i = 0; i < len; i++)
	{
          
   
		cout << arr[i] << " ";
	}
	cout << endl<<endl<<endl;
	for (r = len / 2; r >= 1; r /= 2)
	{
          
   
		for (i = r; i < len; i++)
		{
          
   
			temp = arr[i];
			j = i - r;
			while (j >= 0 && temp < arr[j])
			{
          
   
				arr[j + r] = arr[j];
				j -= r;
			}
			arr[j + r] = temp;
		}
		x++;
		cout << "第" << x << "步的排序结果: ";
		for (h = 0; h < len; h++)
		{
          
   
			cout << arr[h] << " ";
		}
		cout << endl<<endl<<endl;
	}
	cout << "最终的序列为: ";
	for (h = 0; h < len; h++)
	{
          
   
		cout << arr[h] << " ";
	}
	cout << endl;
}
int main()
{
          
   
	int arr[SIZE] = {
          
    4,6,2,8,1,2,9,7,3,5 };
	shellSort(arr, SIZE);
	system("pause");
	return 0x0;
}

执行过程

算法性能分析

平均时间复杂度 最坏情况 最好情况 空间复杂度 稳定性 O(n㏒₂ⁿ) O(n㏒₂ⁿ) O(1) 不稳定

参考

Algorithms (Fourth Edition) [美] Robert Sedgewick

经验分享 程序员 微信小程序 职场和发展