C/C++ 数组排序(平均时间复杂度 O(nlogn))归并、快速、堆、希尔之希尔排序

9 篇文章 1 订阅

希尔排序:

给定一个int数组A以及大小n,请返回排序后的数组;

核心思想:

1、先选择步长i,这里的步长是动态的,每次为之前步长的一半,还有一种方法是设置步长数组,但数组中步长为小于20的素数;

2、每次更新步长后,都要从步长大小的索引j=i开始,从索引j开始直到结束,进行遍历,并记录当前值为temp。

2.1每次temp都要与k=j-i的索引对应的值(也就是索引j的前面长度为步长的位置的值)进行比较;

2.2如果temp(后)<A[k](前),说明大数在前面,要让他换到后面,换到K+长度i的位置A[k+i]=A[k](因为k+i的位置的值被temp记录了,不会丢失)

2.3循环2.3,让K向左走步长个单位,进行填补,将大于temp的全部挪到后面去(每个间隔为步长i)。当temp(后)>=A[k](前)时,说明找到了temp的合适位置A[k],因为程序中多减了一次,所以是A[k+i]=temp;(重点理解)


代码:

class ShellSort {  
public:  
    int* shellSort(int* A, int n) {   
      
        for(int i=n/2; i>=1; i=i/2){  
            for(int j=i; j<n; j++){  
                int tmp = A[j];           
                for(int k=j-i; k>=0 && tmp<A[k]; k=k-i){   //插入排序,向左插入,每次递减一个步长,并且比较大小  
                    A[k+i] = A[k];  
                }  
                A[k+i] = tmp; //合适位置,因为多执行了一次k-i,所以是合适位置是K+i 
            }  
        }  
        return A;  
    }  
};    

main调用:

#include <iostream>
using namespace std;
int main(){
	int AAA[]={1,3,6,9,2,5,4,8,7};
	ShellSort S;
	int *b=S.shellSort(AAA,9);
	for(int i=0;i<9;i++){
		cout<<b[i]<<endl;
	}
	
	return 0;
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值