直接選擇排序演算法彙總

weixin_34377065發表於2015-08-12

概念

每次旅行到最後n-i+1(i=1,2,...,n-1)取紀錄最年輕的排序列表i記錄

   

動態效果:

  

長處:演算法簡單,easy實現

缺點:每次僅僅能確定一個元素


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=i+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)); } }

執行上面的程式,能夠看出下圖的排序效果:

image

直接選擇排序每趟僅僅需選出最小的資料。並將其放在本趟首位就可以。能夠發現。事實上每趟僅僅需進行一次交換就可以。而上述演算法在每趟的比較中,進行了不止一次的交換。


改進演算法:

//依次進行n-1次比較。第i趟比較將第i大的值選出放在i位置上
        for(int i=0; i<arrayLength-1; i++){
            //minIndex用於保留本趟中最小值的索引
            int minIndex = i;
            for(int j=i+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)。

image


演算法分析

對於直接選擇排序,資料交換的次數最多要n-1次,但比較的次數較多,時間複雜度為O(n2),空間複雜度僅為O(1)。

從上面兩個data至30的DataWrap排序結果,,直接選擇排序是不穩定。


版權宣告:本文部落格原創文章,部落格,未經同意,不得轉載。

相關文章