C++經典的7種排序演算法

C++經典的7種排序演算法

C++經典的7種排序演算法

剛才在網路上閒晃,發現C++經典的7種排序演算法的程式碼,馬上實測驗證,確定可用,趕緊PO出來和大家分享,有興趣的同好歡迎來(C/P)一下。

 

#include <iostream>

#include <cstdio>

using namespace std;

//C++經典的7種排序演算法

/*

參考網頁::  http://www.caogenit.com/caogenxueyuan/yingyongfangxiang/rengongzhineng/1724.html

*/

//////////////////////////////////////

void SelectSort(int* array, int size);

void InsertSort(int* array, int size);

void BubbleSort(int* array, int size);

void MergeSort(int* array, int left, int right);

void Merge(int* array, int left, int mid, int right);

void HeapSort(int *array, int size);

void HeapAjust(int *array, int toAjust, int size);

void QuickSort(int *array, int left, int right);

void TreeSort(int *array, int size);

void TreeMidRetrival(int* array, int* temp, int pos, int* lChild, int* rChild);

void Swap(int* array, int x, int y);

/////////////////////////////////////////

void Swap(int* array, int x, int y)

{

    int temp = array[x];

    array[x] = array[y];

    array[y] = temp;

}

//選擇排序

void SelectSort(int* array, int size)

{

    int minIndex;

    for(int i = 0; i < size; i++)

    {

        minIndex = i;

        for(int j = i + 1; j < size; j++)

        {

            if(array[minIndex] > array[j])

            {

                minIndex = j;

            }

        }

        if(minIndex != i)

        {

            Swap(array, i, minIndex);

        }

    }

}

//氣泡排序

void BubbleSort(int* array, int size)

{

    for(int i = 0; i < size; i++)

    {

        for(int j = 1; j < size i; j++)

        {

            if(array[j] < array[j 1])

            {

                Swap(array, j, j 1);

            }

        }

    }

}

//插入排序

void InsertSort(int* array, int size)

{

    for(int i = 1; i < size; i++)

    {

        for(int j = i; j > 0; j–)

        {

            if(array[j] < array[j 1])

            {

                Swap(array, j, j1);

            }

        }

    }

}

//快速排序

void QuickSort(int* array, int left, int right)

{

    if(left < right)

    {

        int i = left1, j = right + 1;

        int mid = array[(left + right) / 2];

        while(true)

        {

            while(array[++i] < mid);

            while(array[–j] > mid);

            if(i >= j)

            {

                break;

            }

            Swap(array, i, j);

        }

        QuickSort(array, left, i 1);

        QuickSort(array, j + 1, right);

    }

}

void Merge(int* array, int left, int mid, int right)

{

    int* temp = new int[right left + 1];

    int i = left, j = mid + 1, m = 0;

    while(i <= mid && j <= right)

    {

        if(array[i] < array[j])

        {

            temp[m++] = array[i++];

        }

        else

        {

            temp[m++] = array[j++];

        }

    }

    while(i <= mid)

    {

        temp[m++] = array[i++];

    }

    while(j <= right)

    {

        temp[m++] = array[j++];

 

    }

    for(int n = left, m = 0; n <= right; n++, m++)

    {

        array[n] = temp[m];

    }

    delete temp;

}

//歸併排序

void MergeSort(int* array, int left, int right)

{

    if(left < right)

    {

        int mid = (left + right) / 2;

        MergeSort(array, left, mid);

        MergeSort(array, mid + 1, right);

        Merge(array, left, mid, right);

    }

}

//調整堆

void HeapAjust(int *array, int toAjust, int size)

{

    int pos = toAjust;

    while((pos * 2 + 1) < size)

    {

        int lChild = pos * 2 + 1;

        if(array[lChild] > array[pos])

        {

            pos = lChild;//左孩子大

        }

        int rChild = lChild + 1;

        if(rChild < size && array[rChild] > array[pos])

        {

            pos = rChild;//右孩子更大

        }

        if(pos != toAjust) //父結點比其中一個孩子小

        {

            Swap(array, toAjust, pos);

            toAjust = pos;

        }

        else

        {

            break;

        }

    }

}

//堆排序

void HeapSort(int* array, int size)

{

    int lastP = size / 2;

    //從最後一個有孩子的結點開始建初始堆

    for(int i = lastP 1; i >= 0; i–)

    {

        HeapAjust(array, i, size);

    }

    int j = size;

    //將堆頂元素和無序區間的最後一個元素交換,再調整堆

    while(j > 0)

    {

        Swap(array, 0, j 1);

        j–;

        HeapAjust(array, 0, j);

    }

}

//樹排序

void TreeSort(int* array, int size)

{

    int *parent = new int[size];//父結點子針

    int *lChild = new int[size];//左孩子子針

    int *rChild = new int[size];//右孩子子針

    //將各結點左右子結點指標均置為-1,表示沒有左右子結點

    for(int i = 0; i < size; i++)

    {

        lChild[i] = –1;

        rChild[i] = –1;

    }

    parent[0] = –1; //將第一個元素作為根結點,其父結點置為-1

    //從第2個數開始構造樹

    for(int i = 1; i < size; i++)

    {

        int last = 0;

        while(true)

        {

            int compare = array[i] – array[last];

            if(compare > 0) //比當前值大,進入右子樹

            {

                if(rChild[last] == –1)

                {

                    rChild[last] = i;

                    parent[i] = last;

                    break;

                }

                else

                {

                    last = rChild[last];

                }

            }

            else //比當前值小,進入左子樹

            {

                if(lChild[last] == –1)

                {

                    lChild[last] = i;

                    parent[i] = last;

                    break;

                }

                else

                {

                    last = lChild[last];

                }

            }

        }

    }

    //保存排序樹的中序遍歷結果

    int* midRetrival = new int[size];

    TreeMidRetrival(array, midRetrival, 0, lChild, rChild);

    //將排好序的中序數組複製到原陣列

    for(int i = 0; i < size; i++)

    {

        array[i] = midRetrival[i];

    }

}

//中序遍歷

void TreeMidRetrival(int *array, int* temp, int pos, int* lChild, int* rChild)

{

    static int i = 0;

    if(pos != –1)

    {

        TreeMidRetrival(array, temp, lChild[pos], lChild, rChild);//遍歷左子樹

        temp[i++] = array[pos];//保存當前值

        TreeMidRetrival(array, temp, rChild[pos], lChild, rChild);//遍歷右子樹

    }

    else

    {

        return;

    }

}

int main()

{

    int i;

    int intdata[5]={5,3,1,2,4};

    printf(“before: “);

    for(i=0;i<5;i++)

    {

         printf(“%d\t”,intdata[i]);

    }

    printf(“\n”);

    //SelectSort(intdata, 5);

    //InsertSort(intdata, 5);

    BubbleSort(intdata, 5);

    //MergeSort(intdata, 0, 4);

    //HeapSort(intdata, 5);

    //QuickSort(intdata, 0, 4);

    //TreeSort(intdata, 5);

    printf(“after: “);

    for(i=0;i<5;i++)

    {

         printf(“%d\t”,intdata[i]);

    }

    printf(“\n”);

    cout << “Hello world!” << endl;

    return 0;

}

 

 

 

 

 


3 thoughts on “C++經典的7種排序演算法

  1. 個人認為目前最為推薦 [效率(速度)&額外記憶體使用量&穩定度] 的排序法 – 归并排序/歸併排序/合併排序 (Merge Sort) (2019/06/11 特此紀錄)

  2. 排序法的性能評估指標:

    穩定:如果a原本在b前面,而a=b,排序之後a仍然在b的前面。

    不穩定:如果a原本在b的前面,而a=b,排序之後a可能會出現在b的後面。

    時間複雜度:對排序數據的總的操作次數。反映當n變化時,操作次數呈現什麼規律。

    空間複雜度:是指算法在計算機內執行時所需存儲空間的度量,它也是數據規模n的函數。

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *