数据结构-排序

综述:

基于比较的算法时间复杂度至少需要O(n×log2n)
在这里插入图片描述

内部排序:

当目标长度较短可直接由外村读入内存进行排序时,直接适用内部算法

一、插入排序

直接排序(InsertSort)

相当于每次操作都是对一个已排好序的序列进行排序,找到对应的位置(边比较边移动),用哨兵替代该位置的值

    //直接插入排序
    static void insertSort(int[] elem){
   
        int i,j;
        //从第二位起开始遍历(第0位是哨兵位,第一位是参照位)
        for (i = 2; i < elem.length; i++) {
   
            //将哨兵位设置为当前排序元素
            elem[0] = elem[i];
            //顺序遍历当前排序元素之前的所有元素,查找到目标位置(j+1)
            //边查边改,遍历到前一元素与哨兵顺序是一致时(升序/降序)跳出循环
            for (j = i-1 ; elem[j]>elem[0] ; j--) {
   
                elem[j+1] = elem[j];
            }
            //到达j+1
            elem[j+1] = elem[0];
        }
        System.out.println(Arrays.toString(elem));
    }

在这里插入图片描述
时间复杂度 = O(n2)
稳定性 = 稳定(出现相等元素仍成功)
适应存储 = 顺序存储和链式存储

折半排序(BInsertSort)

在直接排序基础上进行优化,直接排序是在已排序好的序列中进行顺序查找到对应位置,而折半排序是用折半查找到对应位置(high+1)

    //折半插入排序
    static void insertSort(int[] elem){
   
        int i,j;
        int low,mid,high;
        //从第二位起开始遍历(第0位是哨兵位,第一位是参照位)
        for (i = 2; i < elem.length; i++) {
   
            //将哨兵位设置为当前排序元素
            elem[0] = elem[i];
             //折半遍历当前排序元素之前的所有元素,查找到目标位置(high+1)
            while(low>=high){
   
            	mid = (low+high)/2;
            	if(elem[mid] > elem[0]){
   
            		high = mid - 1;
            	}else{
   
            		lwo = mid + 1;
            	}
            }
            //边移动边改
            for (j = i-1 ; j>=hgih+1 ; j--) {
   
                elem[j+1] = elem[j];
            }
            //到达high+1
            elem[high+1] = elem[0];
        }
        System.out.println(Arrays.toString
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值