選擇排序

爲什麼叫選擇排序:就是先選擇出最小的放前邊(最大放後邊)

選擇排序,和冒泡排序一樣,還是雙層循環

用內層for選擇出最小,然後把最小交換到最前,只需要交換一次.

原數組:[5, 8, 6, 3, 9, 2, 1, 7]
第0輪[] - [5,8,6,3,9,2,1,7]剩餘最小數array[6]=1.交換5和1
第1輪[1] - [8,6,3,9,2,5,7]剩餘最小數array[5]=2.交換8和2
第2輪[1,2] - [6,3,9,8,5,7]剩餘最小數array[3]=3.交換6和3
第3輪[1,2,3] - [6,9,8,5,7]剩餘最小數array[6]=5.交換6和5
第4輪[1,2,3,5] - [9,8,6,7]剩餘最小數array[6]=6.交換9和6
第5輪[1,2,3,5,6] - [8,9,7]剩餘最小數array[7]=7.交換8和7
第6輪[1,2,3,5,6,7] - [9,8]剩餘最小數array[7]=8.交換9和8
第7輪,[1, 2, 3, 5, 6, 7, 8, 9],剩餘最小數array[7]=9.沒有需要交換

 

package sort.selection;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @description: 選擇排序
 * 每一輪先選出最小元素,把最小元素放到第一個位置
 * @author:tao
 * @create: 2019-12-27 16:01
 */
public class SelectionSort {


    @Test
    public void selectionSortTest() {
        int []array = {3, 45, 7, 4, 24, 77, -2};
        System.out.println("原數組:" + Arrays.toString(array));
        selectionSort(array);
        System.out.println("排序數組:" + Arrays.toString(array));
    }

    @Test
    public void selectionSortTest2() {
        int []array = {5, 8, 6, 3, 9, 2, 1, 7};
        System.out.println("原數組:" + Arrays.toString(array));
        selectionSort(array);
        System.out.println("排序數組:" + Arrays.toString(array));
    }

    private void selectionSort(int[] array) {
        int forTimes = 0;
        int swapTimes = 0;

        for (int i = 0; i < array.length; i++) {
            int minValueIndex = i;
            for (int j = i+1; j < array.length; j++) {
                minValueIndex = array[j] < array[minValueIndex] ? j : minValueIndex;
                // forTimes test代碼
                forTimes ++;
            }
            if (array[i] > array[minValueIndex]) {
                // swapTimes test代碼

                soutLog(array, i, minValueIndex);
                swapTimes ++;


                int temp = array[i];
                array[i] = array[minValueIndex];
                array[minValueIndex] = temp;

            } else {
                System.out.println("第" + i + "輪," + Arrays.toString(array) + ",剩餘最小數array["+ minValueIndex +"]=" + array[minValueIndex] + ".沒有需要交換");
            }

        }
        System.out.println("循環次數forTimes = " + forTimes);
        System.out.println("發生交換次數swapTimes = " + swapTimes);
    }

    /**
     * 打印日誌 便於觀察
     * @param array
     * @param i
     * @param minValueIndex
     */
    private void soutLog(int[] array, int i, int minValueIndex) {
        List<String> sortList = new ArrayList<>();
        List<String> unSortList = new ArrayList<>();
        for (int i1 = 0; i1 < array.length; i1++) {
            if (i1 <= i-1) {
                sortList.add(array[i1] + "");
            } else {
                unSortList.add(array[i1] + "");
            }
        }
        System.out.println("第" + i + "輪[" + String.join(",", sortList) + "] - [" + String.join(",", unSortList) +
                "]剩餘最小數array["+ minValueIndex +"]=" + array[minValueIndex] + ".交換" + array[i] + "和" + array[minValueIndex]);
    }

    /**
     原數組:[5, 8, 6, 3, 9, 2, 1, 7]
     第0輪[] - [5,8,6,3,9,2,1,7]剩餘最小數array[6]=1.交換5和1
     第1輪[1] - [8,6,3,9,2,5,7]剩餘最小數array[5]=2.交換8和2
     第2輪[1,2] - [6,3,9,8,5,7]剩餘最小數array[3]=3.交換6和3
     第3輪[1,2,3] - [6,9,8,5,7]剩餘最小數array[6]=5.交換6和5
     第4輪[1,2,3,5] - [9,8,6,7]剩餘最小數array[6]=6.交換9和6
     第5輪[1,2,3,5,6] - [8,9,7]剩餘最小數array[7]=7.交換8和7
     第6輪[1,2,3,5,6,7] - [9,8]剩餘最小數array[7]=8.交換9和8
     第7輪,[1, 2, 3, 5, 6, 7, 8, 9],剩餘最小數array[7]=9.沒有需要交換
     循環次數forTimes = 28
     發生交換次數swapTimes = 7
     排序數組:[1, 2, 3, 5, 6, 7, 8, 9]
     */
}

相比較冒泡排序,空間時間負責度並沒有減少,但是減少了數據交換次數.

發佈了39 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章