选择排序

人盡茶涼 提交于 2019-12-26 05:34:07

原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排序好的序列最后,直到全部记录排序完毕。基于此思想的算法主要有简单选择排序、树形选择排序和堆排序(这里只介绍常用的简单选择排序);

简单选择排序的基本思想:给定数组int arr={里面n个数据};,第1趟排序,在待排序数据arr[1]~arr[n]中选出最小的数据,将它与arr[1]交换;第2趟,在待排序数据arr[2]~arr[n]中选出最小的数据,将它与arr[2]交换;以此类推,第i趟在待排序数据arr[i]~arr[n]中选出最小数据,将它与arr[i]交换,直到全部排序完成;

举例:数组 int[] arr={5 2 8 4 9 1}
第一趟排序:
最小数据1,把1放在首位,排序结果:1 2 8 4 9 5
第二趟排序:
最小数据2,排序结果:1 2 8 4 9 5
第三趟排序:
最小数据4,排序结果:1 2 4 8 9 5
第四趟排序:
最小数据5,排序结果:1 2 4 5 9 8
第五趟排序:
最小数据8,排序结果:1 2 4 5 8 9

注:每一趟排序获得最小数的方法:for循环进行比较,定义一个第三个变量tmp,首先前两个数比较,把较小的数放在tmp中,然后用tmp再去跟剩下的数据比较,如果出现比tmp小的数据,就用它代替tmp中原有的数据;

示例代码:
public class Test {

    public static void main(String[] args) {
        
        int[] arr = {6, 3, 8, 2, 9, 1};
        System.out.println("排序前数组为:");
        for(int i : arr) {
            System.out.print(i + ", ");
        }
        System.out.println();
        sort(arr);
        
        System.out.println("排序后数组为:");
        for(int i : arr) {
            System.out.print(i + ", ");
        }
        
    }
    
    public static void sort(int[] arr) {
        for(int i=0; i<arr.length - 1; i++) { //做第i趟排序
            int k = i;
            for(int j = i+1; j<arr.length; j++) { //选最小的记录
                if(arr[k] < arr[j]) {
                    k = j; //记下目前找到的最小值所在的位置
                }
            }
            if(k != i) { //内循环结束,执行交换
                int tmp = arr[k];
                arr[k] = arr[i];
                arr[i] = tmp;
            }
        }
    }
    
}
选择排序的时间复杂度为O(N^2),空间复杂度为O(1),
不稳定,因为正序时移动最少,反序时移动最多。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!