十大经典排序算法

一、直接插入排序
二、希尔排序
三、冒泡排序
四、快速排序
五、简单选择排序
六、堆排序
七、归并排序
八、基数排序
九、计数排序
十、桶排序

一、直接插入排序

【算法思想】

在这里插入图片描述

【代码】

public void insertSort(int[] nums){
   
	int len = nums.length;      //len=10
	
	for(int i=1;i<len;i++){
        //每次排第i个元素。
		
		int tmp = nums[i];      //第i趟排序就是把nums[i]插进来。
		
		int j=i;
		while(j>0 && nums[j-1]>tmp){
   
			nums[j] = nums[j-1];
			j--;
		}
		nums[j] = tmp;
	}
}

时间复杂度:最好:o(n) 最坏:o(n2) 平均:o(n2)
稳定排序。

二、希尔排序

【算法思想】

我们选择增量gap=len/2,缩小增量继续以gap = gap/2的方式,这种增量选择我们可以用一个序列来表示,{n/2,(n/2)/2…1},称为增量序列。希尔排序的增量序列的选择与证明是个数学难题,我们选择的这个增量序列是比较常用的,也是希尔建议的增量,称为希尔增量,但其实这个增量序列不是最优的。

在这里插入图片描述
在这里插入图片描述

【代码】

public void shellSort(int[] nums){
   
	int len = nums.length;
	
	for(int gap = len/2; gap>=1; gap /= 2){
     //增量gap
		
		for(int i=gap; i<len ;i++){
             //i++而不是i+=gap。
			int tmp = nums[i];
			
			int j=i;
			while(j>=gap && nums[j-gap]>tmp){
   
				nums[j] = nums[j-gap];
				j -= gap;
			}
			nums[j] = tmp;
		}
	}
}

希尔排序的时间复杂度依赖于增量序列的函数,涉及到数学上尚未解决的难题。当n在某个特定范围时,希尔排序的时间复杂度约为o(n1.3)。最坏情况下为o(n2)。

三、冒泡排序

【算法思想】

在这里插入图片描述
在这里插入图片描述

【代码】

public void bubbleSort(int[] nums){
   
	int len = nums.length;            //len=10
	
	for(int i=0;i<len-1;i++){
            //只需要9趟排序。i范围:0~8
		for(int j=0;j<len-i-1;j++){
      //第4趟排序,i=3,已经有3个元素排好。只需排len-3个元素:0~6。j范围:0~5
			if(nums[j] > nums[j+1]){
   
				int tmp = nums[j];nums[j] = nums[j+1];nums[j+1] = tmp;  //交换
			}
		}
	}
}

改进:

public void bubbleSort(int[] nums){
   
	int len = nums.length;            //len=10
	boolean flag;
	
	for(int i=0;i<len-1;i++){
            //只需要9趟排序。i范围:0~8
		flag = false;
		
		for(int j=0;j<len-i-1;j++)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值