选择排序
选择排序对冒泡排序进行了改进,将交换次数从O(n2)降低到了O(n),比较次数仍然是O(n2)
情景:对数组 int[] arr = {6,9,5,2,8,7}中的数据 从小到大排序。
思路:在第一趟排序中,从下标为0开始选择出最小的数字,和arr[0]进行交换,此时,最左侧的数字已经是有序状态了。在第二趟排序中,从下表为1开始选择出最小的数字,然后和arr[1]进行交换,以此类推。注意,红色数字表示已排序。
第一趟排序后: 2 5 6 8 7 9
第二趟排序后: 2 5 6 8 7 9
第三趟排序后: 2 5 6 8 7 9
第四趟排序后: 2 5 6 7 8 9
第五趟排序后: 2 5 6 7 8 9
代码:
/** * 选择排序 * @author D N * */ public class SelectSort { private long[] a; private int nElems; public SelectSort(int max){ a = new long[max]; nElems = 0; } public void insert(long value){ a[nElems] = value; nElems++; } public void display(){ for(int j=0;j<nElems;j++){ System.out.print(a[j]+" "); } System.out.println(""); } public void swap(int one,int two){ long temp = a[one]; a[one] = a[two]; a[two] = temp; } //选择排序算法 public void selectSort(){ int in,out,min; for(out = 0;out < nElems-1;out++){ min = out; for(in = out+1;in < nElems;in++){ if(a[in] < a[min]){ min = in; } } swap(out, min); } } }
运行测试代码:
public class SortTest { public static void main(String[] args) { int maxSize = 10; SelectSort arr = new SelectSort(maxSize); arr.insert(6); arr.insert(9); arr.insert(5); arr.insert(2); arr.insert(8); arr.insert(7); arr.display(); arr.selectSort(); arr.display(); } }
结果:
6 9 5 2 8 7 2 5 6 7 8 9
效率分析:
选择排序的时间复杂度是O(n2),不过选择排序交换的次数比冒泡排序要少,所以相比冒泡排序,效率要高一些。