演算法與資料結構——選擇排序(c++)

cool_cool_coo1發表於2019-02-02

排序演算法

為什麼要學習O(n^2)的排序演算法?

基礎

  • 編碼簡單,易於實現,是一些簡單情景的首選
  • 在一些特殊情況下,簡單的排序演算法更有效
  • 簡單的排序演算法思想衍生出複雜的排序演算法
  • 作為子過程,改進更復雜的排序演算法

選擇排序——Selection Sort

依次在剩下的部分(當前還沒有排序的部分)找出最小的元素,與第一個調換位置。

#include <iostream>

using namespace std;

void selectionSort(int arr[] ,int n){
        for(int i=0;i<n;i++){
            //尋找[i,n)區間裡的最小值
            int mid=i;
            //找出未排序部分的最小值,將他的下標值賦給mid,將最小值的索引存在mid中
            for(int j=i+1;j<n;j++){
                if(arr[mid]>arr[j]){
                    mid=j;//更新mid
                }
            }
            //找出最小值,此時mid的值就是其下標,交換
            //交換函式swap(),c++標準庫中內建的函式,在名稱空間std中
            swap(arr[i],arr[mid]);

        }
}
int main() {
    int a[10]={5,8,9,7,3,0,2,1,4,6};
    selectionSort(a,10);
    for(int i=0;i<10;i++){
        cout<<a[i]<<" ";
    }
    cout<<endl;
    return 0;
}

只能對整形進行排序——改進:

main.cpp

#include <iostream>
#include "Student.h"
using namespace std;
//要排序的內容很多,所以使用模板函式(泛型)
template <typename  T>
//出入的陣列為T型別
void selectionSort(T arr[] ,int n){
        for(int i=0;i<n;i++){
            //尋找[i,n)區間裡的最小值
            int mid=i;
            //找出未排序部分的最小值,將他的下標值賦給mid,將最小值的索引存在mid中
            for(int j=i+1;j<n;j++){
                if(arr[j]<arr[mid]){
                    mid=j;//更新mid
                }
            }
            //找出最小值,此時mid的值就是其下標,交換
            //交換函式swap(),c++標準庫中內建的函式,在名稱空間std中
            swap(arr[i],arr[mid]);

        }
}
int main() {
    //傳入整型陣列
    int a[10]={5,8,9,7,3,0,2,1,4,6};
    //呼叫選擇排序函式
    selectionSort(a,10);
    //遍歷列印陣列
    for(int i=0;i<10;i++){
        cout<<a[i]<<" ";
    }
    cout<<endl;

    // 測試模板函式,傳入浮點數陣列
    float b[4] = {4.4,3.3,2.2,1.1};
    selectionSort(b,4);
    for( int i = 0 ; i < 4 ; i ++ )
        cout<<b[i]<<" ";
    cout<<endl;

    // 測試模板函式,傳入字串陣列
    string c[4] = {"D","C","B","A"};
    selectionSort(c,4);
    for( int i = 0 ; i < 4 ; i ++ )
        cout<<c[i]<<" ";
    cout<<endl;

    // 測試模板函式,傳入自定義結構體Student陣列
    Student d[4] = { {"D",90} , {"C",100} , {"B",95} , {"A",95} };
    selectionSort(d,4);
    for( int i = 0 ; i < 4 ; i ++ )
        cout<<d[i];
    cout<<endl;

    return 0;
}

Student.h

//巨集定義
#ifndef SELECTIONSORT_STUDENT_H
#define SELECTIONSORT_STUDENT_H
//再此寫宣告和實現,開源專案.h檔案不對外隱藏,.cpp編譯後對外隱藏
#include <iostream>
#include <string>
using namespace std;

struct Student{

    string name;
    int score;
    //運算子過載  <
    bool operator<(const Student& otherStudent){
        return score != otherStudent.score ?
               score > otherStudent.score : name < otherStudent.name;
    }
    //友元函式   <<
    friend ostream& operator<<(ostream &os, const Student &student){

        os<<"Student: "<<student.name<<" "<<student.score<<endl;
        return os;
    }
};
#endif //SELECTIONSORT_STUDENT_H

用程式碼生成隨機用例:

SortTestHelper.h

//
// Created by administrator on 2019/2/2.
//

#ifndef SELECTIONSORT_SORTTESTHELPER_H
#define SELECTIONSORT_SORTTESTHELPER_H
#include <iostream>
#include <ctime>
#include <cassert>

using namespace std;


namespace SortTestHelper {

    // 生成有n個元素的隨機陣列,每個元素的隨機範圍為[rangeL, rangeR]
    int *generateRandomArray(int n, int rangeL, int rangeR) {

        assert(rangeL <= rangeR);

        int *arr = new int[n];

        srand(time(NULL));
        for (int i = 0; i < n; i++)
            arr[i] = rand() % (rangeR - rangeL + 1) + rangeL;
        return arr;
    }

    template<typename T>
    void printArray(T arr[], int n) {

        for (int i = 0; i < n; i++)
            cout << arr[i] << " ";
        cout << endl;

        return;
    }

};
#endif //SELECTIONSORT_SORTTESTHELPER_H

main.cpp

#include <iostream>
#include "SortTestHelper.h"

using namespace std;

template<typename T>
void selectionSort(T arr[], int n){

    for(int i = 0 ; i < n ; i ++){

        int minIndex = i;
        for( int j = i + 1 ; j < n ; j ++ )
            if( arr[j] < arr[minIndex] )
                minIndex = j;

        swap( arr[i] , arr[minIndex] );
    }
}

int main() {

    // 測試排序演算法輔助函式
    int N = 10000;
    int *arr = SortTestHelper::generateRandomArray(N,0,100000);
    selectionSort(arr,N);
    SortTestHelper::printArray(arr,N);
    delete[] arr;

    return 0;
}

 

 

 

 

相關文章