幾種常用排序演算法溫習

來源:互聯網
上載者:User
文章目錄
  • 一、 簡單排序方法
  • 二、快速排序
一、 簡單排序方法1.直接插入排序

基本思想:順序地將待排序的記錄按其關鍵碼的大小插入到已排序的記錄子序列的適當位置。

演算法代碼:

 //直接插入排序        public static void InsertSort(SeqList<int> seq)        {            if (seq.IsEmpty() || seq.GetLength() == 1)                return;            Console.Write("1.1 簡單排序  排序前:");            seq.Display();            int tmp;            for (int i = 1; i < seq.GetLength(); i++)            {                if (seq[i] < seq[i - 1])                {                    tmp = seq[i];                    int j;                    for (j = i - 1; j >= 0 && tmp < seq[j]; j--)                    {                        seq[j + 1] = seq[j];                    }                    seq[j + 1] = tmp;                }                Console.Write("i={0}   ", i);                seq.Display();            }        }
       備忘:這裡的SeqList<T>是自訂順序表,這裡就不詳述了。

直接插入排序時間複雜度與順序表的有序性有關,基本在o(n)到o(n2)之間。該演算法是穩定的。若排序記錄的數目 n 較小(如 n≤50)時,可採用直接插入排序或簡
單選擇排序。

2.冒泡排序

基本思想:將相鄰的記錄的關鍵碼進行比較,如果前面記錄的關鍵碼大於後面記錄的關鍵碼,則將它們交換,否則不交換。

演算法代碼:

//冒泡排序        public static void BubbleSort(SeqList<int> seq)        {            if (seq.IsEmpty() || seq.GetLength() == 1)                return;            Console.Write("1.2 冒泡排序  排序前:");            seq.Display();            int tmp;            for (int i = 0; i < seq.Last;i++)            {                for (int j = seq.Last-1; j >= i; j--)                {                    if (seq[j + 1] <seq[j])                    {                        tmp = seq[j];                        seq[j] = seq[j + 1];                        seq[j + 1] = tmp;                    }                }                Console.Write("i={0}   ", i);                seq.Display();            }        }

時間複雜度:最好O(n),最壞O(n^2)。它是穩定的。

3.簡單排序演算法

基本思想:每一趟在n-i+1(i=1,2,…,n-1)個記錄中選取關鍵字最小的記錄作為有序序列的第i個記錄。

演算法代碼:

//簡單選擇排序        public static void SimpleSelectSort(SeqList<int> seq)        {            if (seq.IsEmpty() || seq.GetLength() == 1)                return;            Console.Write("1.3 簡單選擇排序  排序前:");            seq.Display();            int tmp;            int index;            for (int i = 0; i < seq.Last; i++)            {                index = i;                for (int j = i; j <= seq.Last; j++)                {                    if (seq[j] < seq[index])                    {                        index = j;//找到最小元素下標                    }                }                tmp = seq[i];//交換                seq[i] = seq[index];                seq[index] = tmp;                Console.Write("i={0}   ", i);                seq.Display();            }        }

時間複雜度:O(n^2),它是穩定的排序。若記錄的初始狀態已經按關鍵碼基本有序,可採用直接插入排序或冒泡排序。

二、快速排序

基本思想:通過不斷比較關鍵碼,以某個記錄為界(該記錄稱為支點) ,將待排序列分成兩部分。其中,一部分滿足所有記錄的關鍵碼都大於或等於支點記錄的關鍵碼,另一部分記錄的關鍵碼都小於支點記錄的關鍵碼。把以支點記錄為界將待排序列按關鍵碼分成兩部分的過程,稱為一次劃分。對各部分不斷劃分,直到整個序列按關鍵碼有序為止。

演算法代碼:

//快速排序,遞迴,以第一個元素為支點       public static void QuickSort(SeqList<int> seqlist, int low, int high)       {           int tmplow = low;//臨時儲存開頭元素索引           int tmphigh = high;//臨時儲存結束元素索引           int tmp = seqlist[low];           if (low >= high)               return;           while (low < high)           {               while (low < high && seqlist[high] >= tmp)                   high--;               seqlist[low] = seqlist[high];               while (low < high && seqlist[low] <= tmp)                   low++;               seqlist[high] = seqlist[low];           }           seqlist[low] = tmp;           seqlist.Display();           QuickSort(seqlist, tmplow, low - 1);           QuickSort(seqlist, low + 1, tmphigh);       }

時間複雜度:快速排序方法的平均效能最好,時間複雜度為O(nlog2n),當待排序序列已經按關鍵碼隨機分布時,快速排序是最適合的。但快速排序在最壞情況下時間複雜度是O(n2)。快速排序方法是不穩定的排序方法。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.