原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕。也就是:每一趟在n-i+1(i=1,2,…n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。
简单选择排序的基本思想:给定数组:int[] arr={里面n个数据};第1趟排序,在待排序数据arr[1]~arr[n]中选出最小的数据,将它与arrr[1]交换;第2趟,在待排序数据arr[2]~arr[n]中选出最小的数据,将它与r[2]交换;以此类推,第i趟在待排序数据arr[i]~arr[n]中选出最小的数据,将它与r[i]交换,直到全部排序完成。
举例:
arr[] = {3,6,2,7,4,1}
--------------------------------------
第一趟: 1最小,与3交换位置 1,6,2,7,4,3
--------------------------------------
第二趟: 2最小,与6交换位置 1,2,6,7,4,3
--------------------------------------
第三趟: 3最小,与6交换位置 1,2,3,7,4,6
--------------------------------------
第四趟: 4最小,与7交换位置 1,2,3,4,7,6
--------------------------------------
第五趟: 6最小,与7交换位置 1,2,3,4,6,7
--------------------------------------
代码思路
分成两个循环:第一次循环选择的是数组遍历,第二次为未排序的数组遍历及比较。
代码实现
package cn.janson.sort;
public class SelectSort {
public static void selectSort(int[] arr) {
//选择排序的优化
for(int i = 0; i < arr.length - 1; i++) {// 做第i趟排序
int k = i;
for(int j = k + 1; j < arr.length; j++){// 选最小的记录
if(arr[j] < arr[k]){
k = j; //记下目前找到的最小值所在的位置
}
}
//在内层循环结束,也就是找到本轮循环的最小的数以后,再进行交换
if(i != k){ //交换a[i]和a[k]
int temp = arr[i];
arr[i] = arr[k];
arr[k] = temp;
}
}
}
public static void main(String[] args) {
int[] arr={3,6,2,7,4,1};
System.out.println("交换之前:");
for(int num:arr){
System.out.print(num+" ");
}
selectSort(arr);
System.out.println();
System.out.println("交换后:");
for(int num:arr){
System.out.print(num+" ");
}
}
}
测试效果
交换之前:
3 6 2 7 4 1
交换后:
1 2 3 4 6 7
本文详细介绍了简单选择排序的原理和过程,通过实例演示了如何在数组中找出最小元素并将其放置于正确位置,最终实现整个数组的排序。文章还提供了Java代码实现,展示了外部循环用于遍历数组,内部循环用于比较未排序部分的最小值。

被折叠的 条评论
为什么被折叠?



