选择排序
记录相关的Java排序算法,做个资料参考。
算法原理:每一次从待排序的数组元素中选出最小(也可以是最大)的一个元素,放到数组的前面,直到全部待排序的数据元素排完。每次排序:以 i 代表当前需要排序的序号,依次跟后面[i+1,i+2,...,n-1]进行比较找出最小值,将找到的最小值与序号为i的数组元素交换。
程序实现:
package com.test;
public class Test {
public static void main(String[] args) {
int[] arr = {2,5,1,4,3};
System.out.print("原始数据:");
print(arr);
System.out.println();
sort1(arr);
}
/**
* 选择排序
* @param arr
*/
public static void sort1(int[] arr) {
int times = 0;
for (int i = 0; i < arr.length; i++) {
int times2 = 0;
int index = i;
for (int j = i + 1; j < arr.length; j++) {
times2++;
if(arr[index] > arr[j]) {
index = j;
}
}
if(i != index) {
times++;
change(arr, i, index);
}
System.out.print("第" + (i+1) + "排序:");print(arr);System.out.println(",比较次数:" + times2);
System.out.println();
}
System.out.println("交换次数:" + times);
}
/**
* 打印数组
* @param arr
*/
private static void print(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
System.out.print(arr[i] + ", ");
}
System.out.print(arr[arr.length-1]);
}
/**
* 交换数组中的两个位置
* @param arr
* @param i
* @param j
*/
private static void change(int[] arr, int i, int j) {
int tem = arr[i];
arr[i] = arr[j];
arr[j] = tem;
}
}
结果:
原始数据:2, 5, 1, 4, 3
第1排序:1, 5, 2, 4, 3,比较次数:4 分析:第一次排序,以2为基数,依次跟后面的数值做比较,找到最小值1,交换。
第2排序:1, 2, 5, 4, 3,比较次数:3 分析:第二次排序,以5为基数,依次跟后面的数值做比较,找到最小值2,交换。
第3排序:1, 2, 3, 4, 5,比较次数:2
第4排序:1, 2, 3, 4, 5,比较次数:1
第5排序:1, 2, 3, 4, 5,比较次数:0
交换次数:3
从结果可以看出:随着排序次数的增加,比较次数随之减少,对于数组的长度是固定的话,其比较次数也是固定:(n-1)+(n-2)+...+1=n * (n -1) / 2,交换的次数,则跟原始数据的数值顺序有关,最好的情况是0次,最差的是n-1次。