码迷,mamicode.com
首页 > 编程语言 > 详细

排序之选择排序

时间:2020-02-18 23:23:01      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:一个   select   swa   最小   时间复杂度   下标   结束   空间   实现   

  • 排序是将一串数据按照其某个或者某些关键字的大小进行递增或递减排列的操作我,通常指的排序是升序,排序方式是原地排序
  • 下面介绍下选择排序
  • 选择排序

    • 原理:从无序区间中找到最大(最小)的元素,将其放于无序区间的后面(前面),直到所有无序区间内的元素排完后,排序结束
    • 插入排序是一个不稳定的排序

    实现方式

    1. 单向选择排序
      • 遍历无序区间选择出最大的值,放在无序列表的后面
      • 代码:
        public void selectSort(int[] array) {
                for(int i = 0; i < array.length - 1; i++) {
                        //无序区间是[0, array.length - i)
                        //有序区间是[array.length - i, array.length)
                        int max = 0;
                        for(int j = 0; j < array.length - i; j++) {
                                if(array[j] > array[max]) {
                                        max = j;
                                }
                        }
                        int tmp = array[max];
                        array[max] = array[array.length - 1 - i];
                        array[array.length - 1 - i] = tmp;
                }
        }
    2. 双向选择排序

      • 遍历无序区间,找出无序区间中的最大值和最小值,将最小值放在无序区间的前面,将最大值放在无序区间的后面,直到将无序区间的元素都排完
      • 代码:

        public void selectSortOP(int[] array) {
                int left = 0;
                int right = array.length - 1;
        
                while(left <= right) {
                        int min = left;
                        int max = left;
                        //遍历无序区间,找到最大值和最小值的下标
                        for(int i = left + 1; i <= right; i++) {
                                if(array[i] > array[max]) {
                                        max = i;
                                }
                                if(array[i] < array[min]) {
                                        min = i;
                                }
                        }
                        swap(array, min, left);
                        //判断最大的值是否在最左侧,如果是在最左侧的话由于最小的元素已经和他进行了交换,此时最大值的下标就
                        //不再是left,而是交换后的min
                        if (max == left) {
                                max = min;
                        }
                        swap(array, max, right);
                        left++;
                        right--;
                }
        }
        
        private void swap(int[] array, int i, int j) {
                int tmp = array[i];
                array[i] = array[j];
                array[j] = tmp;
        }

    性能分析

    • 时间复杂度:O(N^2)
    • 空间复杂度:O(1)
    • 稳定性:不稳定

    排序之选择排序

    标签:一个   select   swa   最小   时间复杂度   下标   结束   空间   实现   

    原文地址:https://blog.51cto.com/14233687/2471986

    (0)
    (0)
       
    举报
    评论 一句话评论(0
    登录后才能评论!
    © 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
    迷上了代码!