【數據結構】47_選擇排序和插入排序

選擇排序

選擇排序的基本思想

每次(例如第 i 次, i = 0,1,...,n-2) 從後面 n-i 個待排的數據元素中選出關鍵字最小的元素,做爲有序元素序列 i 個元素。

第 i 次選擇排序示例

image.png

分解:

image.png

image.png

動圖:

選擇排序.gif

編程實驗:選擇排序的實現

文件:Sort.hios

#ifndef SORT_H
#define SORT_H

#include "Object.h"

namespace DTLib
{

class Sort : public Object
{
public:
    template <typename T>
    static void Select(T array[], int len, bool min2max = true)
    {
        for (int i=0; i<len; ++i)
        {
            int min = i;
            for (int j=i+1; j<len; ++j)
            {
                if ((min2max ? (array[min] > array[j]) : (array[min] < array[j])))
                {
                    min = j;
                }
            }

            if (min != i)
            {
                Swap(array[i], array[min]);
            }
        }
    }

private:
    Sort();
    Sort(const Sort&);
    Sort &operator= (const Sort&);

    template <typename T>
    static void Swap(T &a, T &b)
    {
        T c(a);
        a = b;
        b = c;
    }
};

}

#endif // SORT_H

文件:main.cpp編程

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

using namespace std;
using namespace DTLib;

int main()
{
    int a[5] = {3, 4, 1, 0, 2};

    Sort::Select(a, 5);

    for (int i=0; i<5; ++i)
    {
        cout << a[i] << " ";
    }

    cout << endl;

    Sort::Select(a, 5, false);

    for (int i=0; i<5; ++i)
    {
        cout << a[i] << " ";
    }

    return 0;
}

輸出:spa

0 1 2 3 4
4 3 2 1 0

插入排序

插入排序的基本思想

當插入第 i (i>=1) 個數據元素時,前面的 V[0], V[1],...,v[i-1] 已經排好;這時,用V[i]的關鍵字與V[0], V[1],...,v[i-1]的關鍵字進行比較,找到位置後將V[i]插入,原來位置上的對象向後順移。

第 i 次插入排序示例

image.png

分解:

image.png

image.png

image.png

動圖

插入排序.gif

編程實驗:插入排序的實現

文件:Sort.hcode

#ifndef SORT_H
#define SORT_H

#include "Object.h"

namespace DTLib
{

class Sort : public Object
{
public:
    template <typename T>
    static void Select(T array[], int len, bool min2max = true)  // O(n*n) 
    {
        for (int i=0; i<len; ++i)
        {
            int min = i;
            for (int j=i+1; j<len; ++j)
            {
                if ((min2max ? (array[min] > array[j]) : (array[min] < array[j])))
                {
                    min = j;
                }
            }

            if (min != i)
            {
                Swap(array[i], array[min]);
            }
        }
    }

    template <typename T>
    static void Insert(T array[], int len, bool min2max = true)  // O(n*n) 
    {
        for (int i=1; i<len; ++i)
        {
            T e = array[i];
            int k = i;

            for (int j=i-1; (j>=0) && (min2max ? (e < array[j]) : (e > array[j])); --j)
            {
                array[j+1] = array[j];
                k = j;
            }

            if (i != k)
            {
                array[k] = e;
            }
        }
    }

private:
    Sort();
    Sort(const Sort&);
    Sort &operator= (const Sort&);

    template <typename T>
    static void Swap(T &a, T &b)
    {
        T c(a);
        a = b;
        b = c;
    }
};

}

#endif // SORT_H

文件:main.cpp對象

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

using namespace std;
using namespace DTLib;

int main()
{
    int a[5] = {3, 4, 1, 0, 2};

    Sort::Insert(a, 5);

    for (int i=0; i<5; ++i)
    {
        cout << a[i] << " ";
    }

    cout << endl;

    Sort::Insert(a, 5, false);

    for (int i=0; i<5; ++i)
    {
        cout << a[i] << " ";
    }

    return 0;
}

輸出:blog

0 1 2 3 4
4 3 2 1 0

小結

  • 選擇排序每次選擇未排元素中的最小元素
  • 插入排序每次將第 i 個元素插入前面 i -1 個已排元素中
  • 選擇排序是不穩定的排序法,插入排序是穩定的排序方法
  • 選擇排序和插入排序的時間複雜度爲 O(n*n)

以上內容整理於狄泰軟件學院系列課程,請你們保護原創!排序

相關文章
相關標籤/搜索