选择排序核心思想:
先从未排序的序列中找出最小的元素,放在序列的首位(最小元素跟首位互换位置);再从剩余的未排序的序列中找出最小的元素,将其放在已排序的序列后面(最小元素跟剩余的未排序序列的首位互换位置),一直重复,直到排序完成。
假设数组arr={3,9,1,7,8,4,2,5,6},我们通过选择排序来把该数组从小到大排序,
1.从未排序的数组arr中找出最小的元素1,放置首位,即arr[0]跟arr[2]互换位置,
结果:arr={1,9,3,7,8,4,2,5,6}
2.从未排序的{9,3,7,8,4,2,5,6}中找出最小的元素2,放在已排序1的后面,即arr[1]跟arr[6]互换位置,
结果:arr={1,2,3,7,8,4,9,5,6},然后一直重复此操作,直到排序完成。
代码实现:
/**
* 选择排序 {3, 9, 1, 7, 8, 4, 2, 5, 6}
*
* @param arr
*/
public void selectionSort(int arr[]) {
for (int i = 0; i < arr.length - 1; i++) {
int k = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[k] > arr[j]) {
k = j;
}
}
if (k != i) {
int a = arr[i];
arr[i] = arr[k];
arr[k] = a;
}
}
String str = "";
for (int i : arr) {
str += i;
}
System.out.println("选择排序" + str);
}
选择排序优缺点:
1.优点:一轮比较只需要换一次位置;
2.缺点:效率慢,不稳定(举个例子5,8,5,2,9 我们知道第一遍选择第一个元素5会和2交换,那么原序列中2个5的相对位置前后顺序就破坏了)。
选择排序和冒泡排序的区别:
1.冒泡排序是比较相邻位置的两个数,而选择排序是按顺序比较,找最大值或者最小值;
2.冒泡排序每一轮比较后,位置不对都需要换位置,选择排序每一轮比较都只需要换一次位置;
3.冒泡排序是通过数去找位置,选择排序是给定位置去找数。