常用排序算法总结----选择排序(java实现)

选择排序(Selection Sort)

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多{\displaystyle n-1}次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。             ---维基百科

选择排序的基本思想:
        给定数组:int[] arr={里面n个数据};
       第1趟排序,在待排序数据arr[1]~arr[n-1]中选出最小的数据,将它与arr[0]交换;

       第2趟,在待排序数据arr[2]~arr[n-1]中选出最小的数据,将它与arr[1]交换;

       以此类推,第i趟在待排序数据arr[i]~arr[n-1]中选出最小的数据,将它与r[i-1]交换,直到全部排序完成。

举例:数组 int[] arr={4,6,3,2,1,5};

-------------------------------------------------------

第一趟排序: 原始数据:4 6 3 2 1 5

最小数据1,把1放在首位,也就是4和1互换位置,

排序结果:1  6 3 2 4 5

-------------------------------------------------------

第二趟排序:

第1以外的数据{6  3   2   4   5}进行比较,2最小,2和6 交换

排序结果:1  2  3  6  4  5

-------------------------------------------------------

第三趟排序:

除1、2以外的数据{ 3  6  4  5}进行比较,3最小,不用换

排序结果:1  2  3  6  4  5

-------------------------------------------------------

第四趟排序:

除第1、2、3以外的其他数据{6 4 5}进行比较,4最小,6和4交换

排序结果:1  2  3  4  6  5

-------------------------------------------------------

第五趟排序:

除第1、2、3、4以外的其他数据{6  5}进行比较,5最小,5和6交换

排序结果:1  2  3  4  5  6

-------------------------------------------------------

示例代码如下:

public static void SelectSort(int[] arr){
        for(int i = 0 ;i<arr.length-1;i++){ // i表示需要排序的趟数
            int min = i;  // 按照从小到大的顺序排列  设min为最小的下标所在的数
            for(int j = i+1;j<arr.length;j++){ //从min下标所在的下一个位置开始
                if(arr[min] > arr[j]){
                    min = j;  // 找到数组中最小的数字的下标 赋值给min
                }
            }
            //  如果要替换的位置为自己本身所在位置不交换无意义   见示例中的第三趟排序:
            if(min != i ){
                int temp = arr[min];
                arr[min] = arr[i];
                arr[i] = temp;
            }
        }
    }

以下是选择排序复杂度:

平均时间复杂度 最好情况 最坏情况 空间复杂度
O(n²) O(n²) O(n²) O(1)

选择排序的简单和直观名副其实,这也造就了它”出了名的慢性子”,无论是哪种情况,哪怕原数组已排序完成,它也将花费将近n²/2次遍历来确认一遍。即便是这样,它的排序结果也还是不稳定的。 唯一值得高兴的是,它并不耗费额外的内存空间。

猜你喜欢

转载自blog.csdn.net/lele52080/article/details/81480222
今日推荐