標籤:排序演算法 java 簡單選擇排序
概念
每一趟在最後的n-i+1(i=1,2,...,n-1)中取最小的記錄作為有序表的第i個記錄
動態效果:
優點:演算法簡單,容易實現
缺點:每次只能確定一個元素
Java實現:
package com.liuhao.sort;import java.util.Arrays;//定義一個資料封裝類class DataWrap implements Comparable<DataWrap>{ int data; String flag; public DataWrap(int data, String flag) { this.data = data; this.flag = flag; } public String toString(){ return data + flag; } @Override public int compareTo(DataWrap dw) { return this.data > dw.data ? 1 : (this.data == dw.data ? 0 : -1); } }public class SelectSort { public static void selectSort(DataWrap[] data){ System.out.println("開始排序"); int arrayLength = data.length; //依次進行n-1次比較,第i趟比較將第i大的值選出放在i位置上 for(int i=0; i<arrayLength-1; i++){ for(int j=1+1; j<arrayLength; j++){ //i上的資料>j上的資料 if(data[i].compareTo(data[j]) > 0){ DataWrap tmp = data[i]; data[i] = data[j]; data[j] = tmp; } } System.out.println("第" + (i+1) + "趟排序後:" + Arrays.toString(data)); } } public static void main(String[] args) { DataWrap[] data = { new DataWrap(21, "") ,new DataWrap(30, "") ,new DataWrap(49, "") ,new DataWrap(30, "*") ,new DataWrap(16, "") ,new DataWrap(9, "") }; System.out.println("排序之前:" + Arrays.toString(data)); selectSort(data); System.out.println("排序之後:" + Arrays.toString(data)); } } 運行上面的程式,可以看出的排序效果:
直接選擇排序每趟只需選出最小的資料,並將其放在本趟首位即可,可以發現,其實每趟只需進行一次交換即可。而上述演算法在每趟的比較中,進行了不止一次的交換。
改進演算法:
//依次進行n-1次比較,第i趟比較將第i大的值選出放在i位置上 for(int i=0; i<arrayLength-1; i++){ //minIndex用於保留本趟中最小值的索引 int minIndex = i; for(int j=1+1; j<arrayLength; j++){ //i上的資料>j上的資料 if(data[minIndex].compareTo(data[j]) > 0){ minIndex = j; } } if(minIndex != i){ DataWrap tmp = data[i]; data[i] = data[minIndex]; data[minIndex] = tmp; } System.out.println("第" + (i+1) + "趟排序後:" + Arrays.toString(data)); }
每趟比較的目的是找出本趟中最小資料的索引(minIndex)。
對於直接選擇排序,資料交換的次數最多要n-1次,但比較的次數較多,時間複雜度為O(n2),空間複雜度僅為O(1)。
從上面兩個data為30的DataWrap的排序結果來看,直接選擇排序是不穩定的。