【資料結構】選擇排序!!!

doctor_xiong發表於2018-01-05

在選擇排序裡面,是將陣列裡面的資料進行遍歷一遍,找到最大的元素,記錄下最大元素的下標,對最大放在合適的位置。
如圖:
這裡寫圖片描述

實現程式碼:

void selectionSort(int[] list) {
    // 需要遍歷獲得最小值的次數
    // 要注意一點,當要排序 N 個數,已經經過 N-1 次遍歷後,已經是有序數列
    for (int i = 0; i < list.length - 1; i++) {
        int temp = 0;
        int index = i; // 用來儲存最小值得索引

        // 尋找第i個小的數值
        for (int j = i + 1; j < list.length; j++) {
            if (list[index] > list[j]) {
                index = j;
            }
        }

        temp = list[index];
        list[index] = list[i];
        list[i] = temp;


        printAll(list);
    }
}

但是,選擇排序在實現上面還是效率不夠高,因為一次遍歷只能找到一個元素。

優化:遍歷一次找到資料裡面的兩個元素,分別找到最小的元素和最小的元素,對最小和最大的元素進行相應位置的交換,那麼在時間複雜度上面就有一定的提高。
如圖:
這裡寫圖片描述

實現程式碼:

void selectsort(int *arr,size_t size)
{
    if(NULL == arr)
        return ;
    int left = 0;
    int right = size;
    while(left < right)
    {
        int i=left;
        int Max = left;//定義最大元素和最小元素
        int Min = left;
        while(i < right-1)
        {
            if(arr[Max]< arr[i+1])
                Max = i+1;      //找到最大元素的下標
            if(arr[Min] > arr[i+1])
                Min = i+1;       //找到最小元素的下標
            i++;
        }
        swap(arr[left],arr[Min]);  //將最小元素放到合適位置
        if(Max == left)
            Max = Min;        //判斷最小元素的位置是不是在最大元素需要放置的位置
        swap(arr[right-1],arr[Max]);
        left++;
        right--;
    }
}

相關文章