手工画图理解常见七种排序算法

常见排序算法及介绍
一,直接插入排序
原理:
整个区间分为有序区间和无序区间,每次拿到无序区间的第一个数去有序区间里找对应的位置。

稳定性:稳定
空间复杂度:O(1)
平均时间复杂度:O(n的平方)
最优情况时间复杂度:O(n)
最坏情况下时间复杂度:O(n的平方)
在这里插入图片描述注意:默认第一个数是有序的故从第二个数开始
代码实现 :

 //直接插入排序
    public static void indexSort(int[] arr) {
   
        int tmp = arr[0];
        for(int i = 1;i < arr.length;i++) {
   
            tmp = arr[i];
            int j;
            for( j = i-1;j >= 0;j--) {
   
                if(arr[j] > tmp) {
   
                    arr[j+1] = arr[j];
                }else {
   
                    break;
                }

            }
            arr[j+1] = tmp;
        }
    }

对于直接插入排序当数据小的时候工作量不是很大,但是当数据多的时候直接插入就有点效率低了,因此在直接插入的基础上还可以改进在有序区间找的时候可以利用二分查找法
代码如下:

//直接插入排序下的折半查找
    public static void BsInsertSort(int[] arr) {
   
        for(int i = 1;i < arr.length;i++) {
   
            int ret = arr[i];
            int left = 0;
            int right = i;
            while(left < right) {
   
                int mid = (left + right)/2;
                if(arr[mid] <= ret) {
   
                    left = mid+1;
                }else {
   
                    right = mid;//考虑到当在边界时,故不能-1;
                }
            }
            for(int j = i;j >left;j--) {
   
                arr[j] = arr[j-1];
            }
            arr[left] = ret;
        }
    }

二,希尔排序
希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成个组,所有距离为gap的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工作。当到达gap=1时,所有记录在统一组内排好序。
即选择好要排序的组数,从大到小进行

稳定性:不稳定
空间复杂度:O(1)
平均时间复杂度:O(n的1.3次方)
最优情况时间复杂度:O(n)
最坏情况下时间复杂度:O(n的平方)
原排序数字:
在这里插入图片描述
在下图中选择gap = 5 ,3 1
当gap = 5时:
第一次结果如下:
在这里插入图片描述当取gap=3时,即分为三组
此时如图所示
在这里插入图片描述交换后结果:
在这里插入图片描述从此次结果可以看出,越小的越靠前,越有序,

接下来在整体进行直接插入排序 ,即可,
最终得到排序结果:
在这里插入图片描述代码实现:

//希尔排序
    public static void shell(int[] arr,int gap
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值