Java中算法---选择排序

原理每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕。也就是:每一趟在n-i+1(i=1,2,…n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。基于此思想的算法主要有简单选择排序、树型选择排序和堆排序。(这里只介绍常用的简单选择排序)

简单选择排序的的基本思想:给定的集合数组arr,第一趟排序,假定0位置的值是最小值,在待排序数组arr[1] ~ arrn[n]中逐个比较,选出最小值数的下标,让他与下标为0的数据进行互换位置;第二趟排序,假定1位置的值是最小值,在待排序数组arr[2] ~ arr[n]中逐个比较,选出最小值的下标,让他与位置1的数据进行互换位置。。。。知道全部排序完后完成。

举例说明:一个集合数据为arr = {8, 9, 6, 3, 5, 7}

第一趟排序,假定一开始的最小是0位元素,也就是8。设定一个int型值m用来记录最小值的下标,此时m=0;用arr[m]依次比较arr[1] ~ arr[n]的数值,如果arr[m]大于arr[x]比较的值,则将m的值设置为x;将arr[1] ~ arr[n]的数值全部比较完后,找到arr数组中最小值的下标元素m,将arr[m]的值与一开始假定的最小值arr[0]进行互换位置,就可以得到第一趟排序后的数据结果:[3, 9, 6, 8, 5, 7];

第二趟排序,假定一开始的最小是1位元素,也就是9。设定一个int型值m用来记录最小值的下标,此时m=1;用arr[m]依次比较arr[2] ~ arr[n]的数值,如果arr[m]大于arr[x]比较的值,则将m的值设置为x;将arr[2] ~ arr[n]的数值全部比较完后,找到arr数组中最小值的下标元素m,将arr[m]的值与一开始假定的最小值arr[1]进行互换位置,就可以得到第一趟排序后的数据结果:[3, 5, 6, 8, 9, 7];

第三趟排序,假定一开始的最小是2位元素,也就是6。设定一个int型值m用来记录最小值的下标,此时m=2;用arr[m]依次比较arr[3] ~ arr[n]的数值,如果arr[m]大于arr[x]比较的值,则将m的值设置为x;将arr[3] ~ arr[n]的数值全部比较完后,找到arr数组中最小值的下标元素m,将arr[m]的值与一开始假定的最小值arr[2]进行互换位置,就可以得到第一趟排序后的数据结果:[3, 5, 6, 8, 9, 7];

第四趟排序,假定一开始的最小是3位元素,也就是8。设定一个int型值m用来记录最小值的下标,此时m=3;用arr[m]依次比较arr[34 ~ arr[n]的数值,如果arr[m]大于arr[x]比较的值,则将m的值设置为x;将arr[4] ~ arr[n]的数值全部比较完后,找到arr数组中最小值的下标元素m,将arr[m]的值与一开始假定的最小值arr[3]进行互换位置,就可以得到第一趟排序后的数据结果:[3, 5, 6, 7, 9, 8];

第五趟排序,假定一开始的最小是4位元素,也就是9。设定一个int型值m用来记录最小值的下标,此时m=4;用arr[m]依次比较arr[5] ~ arr[n]的数值,如果arr[m]大于arr[x]比较的值,则将m的值设置为x;将arr[5] ~ arr[n]的数值全部比较完后,找到arr数组中最小值的下标元素m,将arr[m]的值与一开始假定的最小值arr[4]进行互换位置,就可以得到第一趟排序后的数据结果:[3, 5, 6, 7, 8, 9];

代码实现:

/** 选择排序 */
List<Integer> integerList = new ArrayList<>();
List<Integer> newsList = new ArrayList<>();
Integer[] integers = {8, 9, 6, 3, 5, 7};
Collections.addAll(integerList, integers);
System.out.println("排序前:" + integerList);

for(int i=0; i<integerList.size()-1; i++) {
    int m = i;
    for(int j=i+1; j<integerList.size(); j++) {
        // 找出最小的值的下标
        if(integerList.get(m) > integerList.get(j)) {
            m = j;
        }
    }
    //找到最小数值后,互换位置
    if(i != m) {
        int temp = integerList.get(i);
        integerList.set(i, integerList.get(m));
        integerList.set(m, temp);
    }
    System.out.println("第" + (i+1) + "趟排序后:" + integerList);
}
System.out.println("最总排序结果为:" + integerList);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章