排序演算法總結之直接選擇排序

來源:互聯網
上載者:User

標籤:排序演算法   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的排序結果來看,直接選擇排序是不穩定的。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.