选择排序、插入排序 的思想(java)

一、选择排序

选择排序的思想很简单,特别容易理解,先找到整个数组中最小的数字,将它和第一个数字交换位置,一轮循环结束;第二轮在剩余的数中找到一个最小值,并将其与数组中的第二个数字交换位置,以此类推…

它有两个很鲜明的特点:
* 数字排序运行的时间和输入数字的顺序没有关系 每次找数组中最小的数字对下一次查找没有提供任何的信息,所以不管怎么样的输入,都会进行N次比较,方能完成排序。
* 数据的移动最少 相比较冒泡排序两两比较就交换位置的不定性来说,选择排序的交换次数和数组的大小成线性关系。

很简单,代码如下:

public class ChooseSort {

    public static void main(String[] args) {
        int[] array = { 5, 6, 4, 2, 8, 6, 3, 7 };
        chooseSort(array);
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }
    }

    public static void chooseSort(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            int min = i;  // 将剩余数组中的第一个数字假定为最小数
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[j] < arr[min]) {
                    min = j;
                }
            }
            // 将剩余数中的最小值与剩余数中的第一个数字交换位置
            int temp = arr[min];
            arr[min] = arr[i];
            arr[i] = temp;
        }
    }

}

二、插入排序

与选择排序一样,当前要插入的索引位置之前的数字都是有序的;不同的是 插入排序所需的时间取决于输入数字的顺序。插入排序不是交换数字的顺序,而是将插入位置后面的原元素全部向后移动。
插入排序对于部分有序的数组非常高效,适合小规模的数组比较。
最好的是顺序,时间复杂度为O(N),如果为逆序的话 这是最糟糕的情况 O(N2)。

具体流程如下:
  1、首先比较数组的前两个数据,并排序;
  2、比较第三个元素与前两个排好序的数据,并将第三个元素放入适当的位置;
  3、比较第四个元素与前三个排好序的数据,并将第四个元素放入适当的位置;
  ……

public class InsertSort {

    public static void main(String[] args) {
        int[] array = { 5, 2, 4, 15, 10, 6, 3, 7, 22, 16, 88 };
        intsertSort(array);
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }
    }

    public static void intsertSort(int[] arr) {
        // 假定第一个数字的顺序是正确的
        for (int i = 1; i < arr.length; i++) {
            //当前要插入的数字target,i为数字的位置
            int target = arr[i];
            int j = i;
            for (; j > 0 && target < arr[j - 1]; j--) {
                // 如果插入的数字小于它前一个数字,则将前一个数字向后移,target插入进去
                arr[j] = arr[j - 1];
            }
            //赋值
            arr[j] = target;
        }
    }

}

哎呀妈 这两个算法整了我好久,终于弄明白了四个算法了。真的对于一个女生来说,搞算法简直脑袋疼,因为之前这部分就比较弱,看来这个 出来混迟早都得还啊。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值