选择排序(Selction Sort)
基本思路:选择某个索引位置的元素,然后和后面的元素依次比较,若大于则交换位置,经过第一轮比较排序后可以得出最小值,然后使用同样的方法把剩下的元素逐个比较即可。
可以看出选择排序,第一轮会选出最小值,第二轮会选择第二个小的值,直到最后。
第一轮从arr[0]和后面的元素比较,第二轮从arr[1]和后面的元素比较,一次类推n个元素要进行n-1轮。选择排序每一轮只进行一次交换,相对于冒泡排序效率高一些。
图解:前三次比较arr[0]都是小的,所以没有交换,第四次比较的时候arr[0]更大,交换位置。
下面我们来看看代码怎么写的:
public static void selectionSort(int[] arr){
for (int i=1; i<=arr.length-1; i++){
if (arr[0] > arr[i]){
int tmp = arr[0];
arr[0] = arr[i];
arr[i] = tmp;
}
}
for (int i=2; i<=arr.length-1; i++){
if (arr[1] > arr[i]){
int tmp = arr[1];
arr[1] = arr[i];
arr[i] = tmp;
}
}
for (int i=3; i<=arr.length-1; i++){
if (arr[2] > arr[i]){
int tmp = arr[2];
arr[2] = arr[i];
arr[i] = tmp;
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
找到规律,最后代码简化如下:
/**
* 选择排序
* @param arr
*/
public static void selectionSort(int[] arr){
for (int times=1; times<=arr.length-1; times++){
for (int i=times; i<=arr.length-1; i++){
if (arr[times-1] > arr[i]){
int tmp = arr[times-1];
arr[times-1] = arr[i];
arr[i] = tmp;
}
}
}
}