选择排序的基本思想是:每一趟(例如第i趟)在后面n-i+1(i=1,2,,...,n-1)个待排序列中选取最小元素,作为有序序列的第i个元素,直到第n-1趟做完,待排元素只剩下1个,就不用再选了。
通俗地说(忽略元素下标)选择排序就是:n个元素需要进行n-1趟排序,每一趟排序在无序组中选择最小的一个与无序组的第一个元素交换位置。
假设一个无序数组arr[]={4,5,2,1,3,9},对这个数组按从小到大的顺序进行选择排序。
第一趟:无序组为:4,5,2,1,5,9;遍历4,5,2,1,3,9选择最小数1与4交换位置,第一趟选择排序后结果为
1,5,2,4,3,9。
第二趟:数组1,5,2,4,3,9;其中无序组为5,2,4,3,9;将5与剩余数比较,选择最小的数与5交换位置,第二趟选择排序后结果为1,2,5,4,3,9。
第三趟:数组1,2,5,4,3,9;其中无序组为5,4,3,9;将5与剩余数比较,选择最小的数与5交换位置,第三趟选择排序后结果为1,2,3,4,5,9。
第四趟:数组1,2,3,4,5,9;其中无序组为4,5,9;将4与剩余数比较,选择最小的数与5交换位置,第四趟选择排序后结果为1,2,3,4,5,9。
第五趟:数组1,2,3,4,5,9;其中无序组为5,9;将5与剩余数比较,选择最小的数与5交换位置,第四趟选择排序后结果为1,2,3,4,5,9。第五趟比较后数组为最终有序组,至此,比较结束。
Java代码实现如下
public class SelectionSort { public void selectSort(int[] arr){ int min = 0; //最小元素下标 int tmp = 0; int i = 0; int j = 0; int len = arr.length; for (i=0;i<len-1;i++){ min = i; //每次将无序组的起始元素下标赋给最小元素下标 for (j=i+1;j<len;j++){ if (arr[min]>arr[j]){ min = j; } } if (min != i){ //如果最小元素的位置不是起始元素,则最小元素与起始元素交换位置 tmp = arr[i]; arr[i] = arr[min]; arr[min] = tmp; } } } public static void main(String[] args){ SelectionSort sort = new SelectionSort(); int[] arr = {4,5,2,1,3,9}; sort.selectSort(arr); for (int i=0; i<arr.length;i++){ System.out.print(arr[i]+" "); } System.out.println(); } }