【GIF动画+完整可运行源代码】C++实现 希尔排序——十大经典排序算法之四

希尔排序由Shell在1959年发明,又叫缩小增量排序,是第一个突破O(n^2)的排序算法,属于简单插入排序的改进版,会优先比较距离较远的元素。

  • 算法步骤:
    • 选择一个增量序列T1,T2,…,Tk, 其中Ti>Tj,Tk=1, i>j;
    • 每趟排序,根据对应的增量Ti,将待排序列分割成若干子序列,分别对各子序列进行直接插入排序;
    • 按增量序列个数k,对序列进行k趟排序。
  • 希尔排序实例:
    下图的增量序列为:5,2,1,第一趟排序将增量为5的子序列进行插入排序,第二趟排序将增量为2的子序列进行插入排序,第三趟将增量为1的子序列进行插入排序,最终完成排序

代码实现

#include <iostream>
 
using namespace std;
 
int a[] = {
    
    70,30,40,10,80,20,90,100,75,60,45};
 
void shell_sort(int a[],int n);
int main()
{
    
    
	cout<<"Before Sort: ";
    for(int i=0; i<11; i++)
		 cout<<a[i]<<" ";
	  cout<<endl;
	  shell_sort(a, 11);
   cout<<"After Sort: ";
	  for(int i=0; i<11; i++)
		  cout<<a[i]<<" ";
	  cout<<endl;
	 system("pause");
}
 
void shell_sort(int a[], int n)
{
    
    
	int gap;
	for(gap = 3; gap >0; gap--)
	{
    
    
		for(int i=0; i<gap; i++)
		{
    
    
			for(int j = i+gap; j<n; j=j+gap)
			{
    
    
				if(a[j]<a[j-gap])
				{
    
    
					int temp = a[j];
					int k = j-gap;
					while(k>=0&&a[k]>temp)
					{
    
    
						a[k+gap] = a[k];
						k = k-gap;
					}
					a[k+gap] = temp;
				}
			}
		}
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_43899069/article/details/109150256