经典排序之选择排序

16 篇文章 0 订阅
3 篇文章 0 订阅

本文在我的个人博客同步更新

 

选择排序是最好理解的一个排序算法,它非常的直观,如果是从小到大排序的话,就是将第一个元素作为基点,依次与后面所有元素比较,如果比后面的元素大就交换位置,这样循环一轮之后,第一个元素就成了最小的元素。

这种排序方法其实就是填坑,第一个坑填最小(最大)的元素,第二个坑填第二小(第二大)的元素,因此选择排序用代码实现起来相当简单。

选择排序和冒泡排序的差别在于冒泡排序是相邻两个元素相互比较,而选择排序是选定一个位置(数组下标),依次与后面的元素比较,直到这个位置(数组下标)的元素保证是最大(最小)的。

下面第一段代码是我自己写的,第二段代码来自维基百科。

//我自己写的代码
public static void selectionSort(int[] arr) {
    for(int i = 0 ; i < arr.length - 1 ; i++) {
        for(int j = i ; j < arr.length - 1 ; j++) {
            if(arr[i] < arr[j+1]) {
                int temp = arr[i];
                arr[i] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
}

//来自维基百科
public static void selectionSort(int[] arr) {
    int min, temp;
    for (int i = 0; i < arr.length; i++) {
        // 初始化未排序序列中最小数据数组下标
        min = i;
        for (int j = i+1; j < arr.length; j++) {
            // 在未排序元素中继续寻找最小元素,并保存其下标
            if (arr[j] < arr[min]) {
                min = j;
            }
        }
        // 将未排序列中最小元素放到已排序列末尾
        if (min != i) {
            temp = arr[min];
            arr[min] = arr[i];
            arr[i] = temp;
        }
    }
}

最后,我们来个复杂度分析:

  • 交换操作:0~(n-1)【如果是已经排序好的,就不需要交换,如果是逆序排列,就需要交换n-1次】
  • 比较操作:n(n-1)/2【(n-1)+(n-2)+...+1=n(n-1)/2】
  • 赋值操作:0~3(n-1)【赋值为三个操作时间,所以是(交换操作)*3】

下期更精彩,我们下期见~

欢迎关注我的微信公众号:一辈子的码农先生,接下来会有非常多的干货总结,这也是我对自己几年工作的一种总结和交代。谢谢大家!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值