1. 程式人生 > 其它 >排序演算法-簡單選擇排序

排序演算法-簡單選擇排序

技術標籤:C/C++程式排序演算法

n個記錄進行簡單選擇排序的基本方法是:通過n-i(i<=i<=n)在此關鍵字之間的比較,從n-i+1的記錄中選出最大(小)記錄,並和第i個記錄進行交換,當i等於n時所有記錄有序排列。

簡單選擇排序法在最好的情況下(已有序),不需要移動元素,次數0。在最壞情況下,前\frac{n}{2}趟中,每趟移動次數為3次(兩個陣列元素交換值),其後不再移動元素,共進行n-1趟排序,總移動次數為3(n-1)/2

總比較次數為\sum_{i=1}^{n-1}(n-i) = \frac{n(n-1)}{2}

簡單選擇排序是一種不穩定的排序方法,其時間複雜度為O(n^{^{2}})。空間複雜度為O(1)

//  非遞減有序排序
void selectsort_ASC(vector<int> &data)
{
    int size = data.size();     //  資料個數
    for(int i = 0; i < size - 1; i++)
    {
       int k = i;  // 未排序中的最小的數下標
       for(int j = i + 1; j < size; j++) // i之前的數是排好序
       {
           if(data.at(j) < data.at(k)) // 發現更小的數
           {
               k = j;
           }
       }

       if(k != i) // i不是最小的數,則交換
       {
           swapNum(data.at(i), data.at(k));
       }
    }
}

//  非遞增有序排序
void selectsort_DESC(vector<int> &data)
{
    int size = data.size();     //  資料個數
    for(int i = 0; i < size - 1; i++)
    {
       int k = i;  // 未排序中的最大的數下標
       for(int j = i + 1; j < size; j++) // i之前的數是排好序
       {
           if(data.at(j) > data.at(k)) // 發現更大的數
           {
               k = j;
           }
       }

       if(k != i) // i不是最大的數,則交換
       {
           swapNum(data.at(i), data.at(k));
       }
    }
}

//  排序,合併成一個函式, bASC
// true : 非遞減有序排序
// false:  非遞增有序排序
void selectsort(vector<int> &data, const bool &bASC)
{
    int size = data.size();     //  資料個數
    for(int i = 0; i < size - 1; i++)
    {
       int k = i;  // 未排序中的最大(小)的數下標
       for(int j = i + 1; j < size; j++) // i之前的數是排好序
       {
           // true : 非遞減有序排序
           // false:  非遞增有序排序
           bool nRet = bASC ? data.at(j) < data.at(k) : data.at(j) > data.at(k);
           if(nRet) // 發現更大(小)的數
           {
               k = j;
           }
       }

       if(k != i) // i不是最大(小)的數,則交換
       {
           swapNum(data.at(i), data.at(k));
       }
    }
}

總:

#include <iostream>
#include <vector>
#include <stdlib.h>
#include <time.h>
using namespace std;

// 交換數值
void swapNum(int &a, int &b)
{
    int tmp = a;
    a       = b;
    b       =  tmp;
}

//  非遞減有序排序
void selectsort_ASC(vector<int> &data)
{
    int size = data.size();     //  資料個數
    for(int i = 0; i < size - 1; i++)
    {
       int k = i;  // 未排序中的最小的數下標
       for(int j = i + 1; j < size; j++) // i之前的數是排好序
       {
           if(data.at(j) < data.at(k)) // 發現更小的數
           {
               k = j;
           }
       }

       if(k != i) // i不是最小的數,則交換
       {
           swapNum(data.at(i), data.at(k));
       }
    }
}

//  非遞增有序排序
void selectsort_DESC(vector<int> &data)
{
    int size = data.size();     //  資料個數
    for(int i = 0; i < size - 1; i++)
    {
       int k = i;  // 未排序中的最大的數下標
       for(int j = i + 1; j < size; j++) // i之前的數是排好序
       {
           if(data.at(j) > data.at(k)) // 發現更大的數
           {
               k = j;
           }
       }

       if(k != i) // i不是最大的數,則交換
       {
           swapNum(data.at(i), data.at(k));
       }
    }
}

//  排序,合併成一個函式, bASC
// true : 非遞減有序排序
// false:  非遞增有序排序
void selectsort(vector<int> &data, const bool &bASC)
{
    int size = data.size();     //  資料個數
    for(int i = 0; i < size - 1; i++)
    {
       int k = i;  // 未排序中的最大(小)的數下標
       for(int j = i + 1; j < size; j++) // i之前的數是排好序
       {
           // true : 非遞減有序排序
           // false:  非遞增有序排序
           bool nRet = bASC ? data.at(j) < data.at(k) : data.at(j) > data.at(k);
           if(nRet) // 發現更大(小)的數
           {
               k = j;
           }
       }

       if(k != i) // i不是最大(小)的數,則交換
       {
           swapNum(data.at(i), data.at(k));
       }
    }
}

//  在控制檯列印
void dadaCout(const vector<int> &data)
{
    int size = data.size();
    for(int i = 0; i < size; i++)
    {
        cout << data.at(i) << " " ;
    }

    cout << endl;
}

int main()
{
    srand((unsigned)time(NULL));        //隨機數種子

    vector<int> data;
    for(int i = 0; i < 15; i++)
    {
        // 獲取兩位數的隨機數
        data.push_back(rand() % 90 + 10);
    }

    // 列印原始資料
    cout << "data:                   ";
    dadaCout(data);

    // 非遞減有序排序
    selectsort_ASC(data);
    cout << "selectsort_ASC:         ";
    dadaCout(data);

    // 非遞增有序排序
    selectsort_DESC(data);
    cout << "selectsort_DESC:        ";
    dadaCout(data);

    // 非遞減有序排序
    selectsort(data, true);
    cout << "selectsort_ASC_true:    ";
    dadaCout(data);

    // 非遞減有序排序
    selectsort(data, false);
    cout << "selectsort_ASC_false:   ";
    dadaCout(data);

    return 0;
}