一、原理
每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕。也就是:每一趟在n-i+1(i=1,2,3...n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。
二、基本思想
给定数组: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,9,1};
第一趟排序:原始数据:5,2,8,9,1
最小数据是1,把1放在首位,也就是1和5互换位置,
排序结果:1,2,8,9,5
第二趟排序:
第1以外的数据{2,8,9,5}进行比较,2最小,不变
排序结果:1,2,8,9,5
第三趟排序:
除1,2以外的数据{8,9,5}进行比较,5最小,5和8互换位置,
排序结果1,2,5,8,9
第四趟排序:
除1,2,5以外的数据{8,9}进行比较,8最小,不变。
排序结果1,2,5,8,9
注:每一趟排序获得最小数的方法:for循环进行比较。
代码实例:
/**
* 选择排序:每一趟从待排序的记录中选出最小的元素,顺序放在已经排好序的序列最后,直到全部记录排序完毕。
* 也就是每一趟在n-i+1(i=1,2,3...n)个记录中选取关键字最小的记录作为有序序列中第i个记录。
* Created by chen on 2017/12/10.
*/
public class SelectionSort {
public static void sort(int[] arr) {
int n = arr.length;//数组长度
for (int i = 0; i < n; i++) {
//寻找[i,n)区间里的最小值的索引
int minIndex = i;
for (int j = i+1; j < n; j++){
if (arr[j] < arr[minIndex])
minIndex = j;
}
swap(arr, i, minIndex);
}
}
/**
* 交换数组位置
* @param arr
* @param i
* @param j
*/
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static void main(String[] args) {
int[] arr = {10,9,8,7,6,5,3,2,1};
SelectionSort.sort(arr);
for (int i = 0; i < arr.length; i++){
System.out.print(arr[i]);
System.out.print(" ");
}
System.out.println();
}
}
网友评论