排序

//排序算法的代碼實現
//時間:2018.08.23
//作者:周晴

#include<iostream>
#include<vector>
#include <algorithm>
using namespace std;  
#define MAXSIZE 10
#define MAX_LENGTH_INSERT_SORT 7

//用於排序的順序表的結構
struct sqList {
    int r[MAXSIZE + 1];
    int length;
};

//交換L中數組r的下標爲i和j的值
void swap(sqList *L,int i,int j) {
    int temp = L->r[i];
    L->r[i] = L->r[j];
    L->r[j] = temp;
}

class Sortieren {
public:
    //冒泡排序:兩兩進行比較,不符合次序的交換
    void bubbleSort(sqList *L) {
        for (int i = 1; i < L->length; i++) {
            //從後向前循環
            for (int j = L->length-1; j >= i; j--) {
                if (L->r[j] > L->r[j + 1])
                    swap(L, j, j+1);
            }
        }

    }

    //冒泡排序的優化,加入標誌位,在一輪比較中,若無移動,則爲有序,停止
    void bubbleSortbetter(sqList *L) {
        bool ifSort = true;
        for (int i = 0; i < L->length&&ifSort; i++) {
            ifSort = false;//標誌位
            //從後向前循環
            for (int j = L->length - 1; j >= i; j--) {
                if (L->r[j] > L->r[j + 1]) {
                    swap(L, i, j);
                    ifSort = true;
                }
            }
        }
    }

    //簡單選擇排序
    void simpleChooseSort(sqList *L) {
        for (int i = 1; i < L->length; i++) {
            int min = i;
            for (int j = i + 1; j <= L->length; j++) {
                if (L->r[j] < L->r[min]) {
                    min = j;
                }
            }
            if (min != i)
                swap(L, i, min);

        }
    }

    //直接插入排序
    void insertSort(sqList *L) {
        int i, j;
        for (i = 2; i <= L->length; i++) {
            if (L->r[i] < L->r[i - 1]) {
                L->r[0] = L->r[i];
                for (j = i - 1; L->r[j] < L->r[0]; j--) {
                    L->r[j + 1] = L->r[j];
                }
                L->r[j + 1] = L->r[0];
            }
        }
    }

    //希爾排序
    void shellSort(sqList *L) {
        int gap = L->length /3+1;
        int i, j, k;
        for (; gap > 1; gap = gap / 3 + 1) {
            for (i = 1; i < gap+1; i++) {
                for (j = i + gap; j < L->length; j += gap) {
                    if (L->r[j] < L->r[j - gap]) {
                        L->r[0] = L->r[j];
                        for (k = j - gap; k >= 0 && L->r[k] > L->r[0]; k -= gap) {
                            L->r[k + gap] = L->r[k];
                        }
                        L->r[k + gap] = L->r[0];
                    }
                }
            }
        }
    }

    //堆排序
    //鍵大頂堆,只有s不符合大頂堆的要求,調整s
    void heapAdjust(sqList *L,int s,int m) {
        int temp, j;
        temp = L->r[s];
        for (j = 2 * s; j <= m; j *= 2) {
            if (L->r[j] < L->r[j + 1])
                ++j;
            if (temp > L->r[j])
                break;
            L->r[s] = L->r[j];
            s = j;
        }
        L->r[s] = temp;

    }

    void heapSort(sqList *L) {
        for (int i = L->length/2; i > 0; i--) {
            heapAdjust(L, i, L->length);
        }
        for (int i = L->length; i > 0; i--) {
            swap(L, 1, i);
            heapAdjust(L, 1, i-1);
        }

    }

    //歸併排序
    //將兩個有序的子序列歸併爲有序序列
    void Merge(int SR[],int TR[],int i,int m,int t) {
        int j, k, l;
        for (int j = m + 1, k = i; j <= t && i <= m; k++) {
            if (SR[i] < SR[j])
                TR[k] = SR[i++];
            else
                TR[k] = SR[j++];
        }
        if (i <= m) {
            for(l=0;l<=m-i;l++)
                TR[k+l] = SR[i+l];
        }
        if (j <= t) {
            for (l = 0; l <= t - j; l++)
                TR[k + l] = SR[j + l];
        }

    }

    void MSort(int SR[],int TR1[],int s,int t) {
        int m;
        int TR2[MAXSIZE + 1];
        if (s == t)
            TR1[s] = SR[s];
        else {
            m = (s + t) / 2;
            MSort(SR, TR2, s, m);
            MSort(SR, TR2, m+1, t);
            Merge(TR2, TR1, s, m, t);
        }
    }

    void mergeSort(sqList *L) {
        MSort(L->r, L->r, 0,L->length);
    }

    //快速排序
    //將序列分爲兩部分,一部分小於樞軸關鍵字,一部分大於樞軸關鍵字,返回樞軸的位置
    int partion(sqList *L, int low, int high) {
        int pivotkey;
        pivotkey = L->r[low];
        L->r[0] = pivotkey;
        //用替換代替交換,將樞軸關鍵字保留在L->r[0]中,減少不必要的交換
        while (low < high) {
            while (low < high&&L->r[high] >= pivotkey)
                high--;
            L->r[low] = L->r[high]; 
            while (low < high&&L->r[low] <= pivotkey)
                low++;
            L->r[high] = L->r[low];
        }
        L->r[low] = L->r[0];
        return low;
    }

    void QSort(sqList *L,int low,int high) {
        int pivot;
        if ((high - low) > MAX_LENGTH_INSERT_SORT) {
            //優化遞歸操作,只進行尾遞歸採用迭代而不是遞歸
            while (low < high) {
                pivot = partion(L, low, high);
                QSort(L, low, pivot - 1);
                low = pivot + 1;
            }
        }
        //待排序序列數目較小時,採用直接插入排序較好
        else
            insertSort(L);
    }

    void quickSort(sqList *L) {
        QSort(L,1,L->length);
    }



};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章