1. 程式人生 > >快速排序和歸併排序演算法

快速排序和歸併排序演算法

快速排序是最快的排序方式,但是它不穩定,它的時間複雜度為O(nlog(n)),空間複雜度為O(logn),它的原理大概的分為如下:
設要排序的陣列是A[0]……A[N-1],首先任意選取一個數據(通常選用陣列的第一個數)作為關鍵資料,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。值得注意的是,快速排序不是一種穩定的排序演算法,也就是說,多個相同的值的相對位置也許會在演算法結束時產生變動。
一趟快速排序的演算法是:
1)設定兩個變數i、j,排序開始的時候:i=0,j=N-1;
2)以第一個陣列元素作為關鍵資料,賦值給key,即key=A[0];
3)從j開始向前搜尋,即由後開始向前搜尋(j–),找到第一個小於key的值A[j],將A[j]和A[i]互換;
4)從i開始向後搜尋,即由前開始向後搜尋(i++),找到第一個大於key的A[i],將A[i]和A[j]互換;
5)重複第3、4步,直到i=j; (3,4步中,沒找到符合條件的值,即3中A[j]不小於key,4中A[i]不大於key的時候改變j、i的值,使得j=j-1,i=i+1,直至找到為止。找到符合條件的值,進行交換的時候i, j指標位置不變。另外,i==j這一過程一定正好是i+或j-完成的時候,此時令迴圈結束)。

#include<iostream>
using namespace std;
 32 void Qsort(int ar[],int low, int high)//升序
 33 { 
 34     if(low >= high)
 35         return;
 36     int i=low;
 37     int j=high;
 38     int key=ar[i];
 39     while(i < j)
 40     {
 41         while(i<j && ar[j--]>key);
 42         ar[i]=ar[j];
 43
while(i<j && ar[i++]<key); 44 ar[j]=ar[i]; 45 } 46 ar[i]=key; 47 Qsort(ar,low,i-1); 48 Qsort(ar,i+1,high); 49 } 50 int main() 51 { 52 int ar[] = {10,30,20,80,70,60,50}; 53 int n=sizeof(ar)/sizeof(ar[0]); 54 55 56 Qsort(ar,0,n-1); 57
for(int i=0; i<n; ++i) 58 cout<<ar[i]<<" "; 59 cout<<endl; 60 delete result; 61 return 0; 62 }

歸併排序:歸併過程為:比較a[i]和b[j]的大小,若a[i]≤b[j],則將第一個有序表中的元素a[i]複製到r[k]中,並令i和k分別加上1;否則將第二個有序表中的元素b[j]複製到r[k]中,並令j和k分別加上1,如此迴圈下去,直到其中一個有序表取完,然後再將另一個有序表中剩餘的元素複製到r中從下標k到下標t的單元。歸併排序的演算法我們通常用遞迴實現,先把待排序區間[s,t]以中點二分,接著把左邊子區間排序,再把右邊子區間排序,最後把左區間和右區間用一次歸併操作合併成有序的區間[s,t]。
它是穩定的排序,空間複雜度為O(n),時間複雜度為O(nlogn).
歸併操作的工作原理如下:
第一步:申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列
第二步:設定兩個指標,最初位置分別為兩個已經排序序列的起始位置
第三步:比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置
重複步驟3直到某一指標超出序列尾
將另一序列剩下的所有元素直接複製到合併序列尾

#include<iostream>
using namespace std;
void Merege(int ar, int br, int star, int mid ,int end)
{
     int i=start, j=mid+1, k=0;
       while(i!=mid+1 && j!=end+1)
       {
           if(ar[i] > ar[j])
               tem[k++] = ar[j++];
          else
              tem[k++] = ar[i++];
      }
      while(i!=mid+1)
          tem[k++]=ar[i++];
      while(j!=end+1)
          tem[k++]=ar[j++];
     for(i=start; i<=end; ++i)
          ar[i]=tem[i];

}
void Meregesort(int ar[], int br[], int start, int end)
{
    int mid;
    if(start < end)
    {
        mid=(start+end)/2;
        Meregesort(ar,br,start,mid);
        Meregesort(ar,br,mid+1,end);
        Merege(ar,br,start,mid,end);
    }
}
int main()
{
    int ar[] = {10,30,20,80,70,60,50};
    int n=sizoef(ar)/sizeof(ar[0]);
    int br[n];
    Mergesort(ar,br,0,n-1);
    for(int i=0; i<n;++i)
        cout<<ar[i]<<"  ";
    cout<<endl;

}

相關推薦

快速排序歸併排序演算法

快速排序是最快的排序方式,但是它不穩定,它的時間複雜度為O(nlog(n)),空間複雜度為O(logn),它的原理大概的分為如下: 設要排序的陣列是A[0]……A[N-1],首先任意選取一個數據(通常選用陣列的第一個數)作為關鍵資料,然後將所有比它小的數都放到

排序演算法快速排序歸併排序

申明:此博文轉自他人,感覺不錯特轉載供大家分享 摘要:一般評判排序演算法的標準有時間代價,空間代價和穩定性。本文主要討論性質相對比較好且作者喜歡的快速排序演算法和歸併排序演算法,並對此這做了一定比較。 正文: 常見的排序演算法大致分為四類: 1.插入排序

快速排序歸併排序的非遞迴實現

1.快速排序 # 快速排序 def partition(li, left, right): i = left j = right r = random.randint(i, j) li[i], li[r] = li[r], li[i] tmp = li[i]

Java快速排序歸併排序區別實現

快速排序與歸併排序的概念: 快速排序(Quicksort)是對氣泡排序的一種改進。    快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通過一趟排序將要排序的資料分割成獨立的兩

第一篇部落格:對插入排序歸併排序演算法時間複雜度的學習

    第一次寫部落格,心情難免有點忐忑,不過為了達到心中的小目標,儘可能的用有效率的方法去提升自己。廢話不多說,下面進入正題。    剛看了網易公開課裡的《麻省理工學院公開課:演算法導論》,受益頗深!國外學校的講課方式確實更有趣味和深度(或許因為在學校壓根沒聽進去過幾節課)

快速排序歸併排序

分而治之(divide - conquer);每個遞迴過程涉及三個步驟 第一, 分解: 把待排序的 n 個元素的序列分解成兩個子序列, 每個子序列包括 n/2 個元素. 第二, 治理: 對每個子序列

快速排序歸併排序 使用圖形化介面的方式

2.8.1題目描述 使用圖形化介面的方式,顯示快速排序和歸併排序的效果。 2.8.2程式使用說明 Java version: 1.8.0_111 IDE:eclipse 歸併排序演示,Eclipse開啟MergeSortDemonstration.java檔案,右鍵run,

理解快速排序歸併排序

從本人很久以前的部落格上轉過來的。原創哈! 1,快速排序 快速排序通過分割值列,然後遞迴的對兩個部分進行排序,從而實現對值列的排序。它的基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部

快速排序歸併排序的時間複雜度分析——通俗易懂

# 一、前言   今天面試的時候,被問到歸併排序的時間複雜度,這個大家都知道是``O(nlogn)``,但是面試官又繼續問,怎麼推匯出來的。這我就有點懵了,因為之前確實沒有去真正理解這個時間複雜度是如何得出的,於是就隨便答了一波(理解了之後,發現面試的時候答錯了......)。 &em

希爾排序歸併排序

1.首先說一下為什麼要搞這些東西。當然是資料結構考試啦,再來複習一下資料結構以及一些常用的演算法,平時都是用的 是sort真的自己敲了一下發現還是不容易一次敲對的。 2.首先是希爾排序,ShellSort,沒錯這個排序方法就是希爾發明的,作為第一個打破排序時間複雜度O(n^2)的方法。首先我

第三週作業——氣泡排序歸併排序(執行氣泡排序

我冒個泡,然後開始排序! 讀入檔案和排序後寫出檔案的氣泡排序。異常處理全都是throws 氣泡排序: package exercise3; import java.io.BufferedReader; import java.io.BufferedWriter; imp

排序演算法總結-選擇排序、插入排序歸併排序快速排序

  前言:   感覺好久沒寫部落格了,十月份的計劃是:要開始深入攻克資料結構和演算法,耽誤好久了,這都月末了,抓緊時間又學習了一波,趕緊來分享了一下,使用的語言是C++,最開始學資料結構一定要用C,掌握紮實之後,想學演算法,用C++比較好,C封裝沒有那麼好,寫起來沒有那麼容易了。   一、準備工作   

排序演算法(直接插入、氣泡排序、選擇排序快速排序、希爾排序、堆排序歸併排序

main函式 int main() { int data[] = {1,2,6,3,4,7,7,9,8,5}; //bubble_sort(data,10); //select_sort(data,10); Insert_Sort(data,10); fo

選擇排序、氣泡排序、合併排序快速排序歸併排序演算法原理

實驗目的: 掌握選擇排序、氣泡排序、合併排序、快速排序、歸併排序的演算法原理 分析不同排序演算法的時間效率和時間複雜度,以及理論值與實測資料的對比分析。 一、氣泡排序 演算法虛擬碼: for i=1 to n     

高階排序演算法【2】--快速排序歸併排序、堆排序

4、快速排序 從數列中挑出一個元素,稱為基準;  重新排列數列,所有元素比基準小的擺放在基準前面,所有元素比基準大的擺在基準後面;  在這個分割槽結束之後,該基準就位於數列的中間位置;  遞迴地對基準左右兩邊的數列進行排序。 快速排序程式碼——第一步 def qui

經典排序演算法——快速排序歸併排序、堆排序

之前兩篇關於排序演算法的綜述以及平方階複雜度的3種具體型別的排序演算法,這一篇將具體介紹其中平均時間複雜度在平方階O(nlog2n)O(nlog_2n)O(nlog2​n)的三個排序演算法,以及各種演算法的程式碼實現(親測正確)。 快速排序 快速排序是由東尼·霍

Python排序演算法(二) 快速排序、希爾排序歸併排序

這篇文章有的排序演算法是:快速排序、希爾排序、歸併排序。 快速排序 ''' 快速排序 ''' def quick_sort(aList, first, last): if first >= last: return min_va

連結串列排序演算法java實現(連結串列的快速排序、插入排序歸併排序

難易程度:★★ 重要性:★★★      連結串列的排序相對陣列的排序更為複雜些,也是考察求職者是否真正理解了排序演算法(而不是“死記硬背”) 連結串列的插入排序 public class LinkedInsertSort { static cla

3. 排序通常有多種演算法,如氣泡排序、插入排序、選擇排序、希爾排序歸併排序快速排序,請選擇任意2種用java實現 [分值:20] 您的回答:(空) (簡答題需要人工評分)

3. 排序通常有多種演算法,如氣泡排序、插入排序、選擇排序、希爾排序、歸併排序、快速排序,請選擇任意2種用java實現  [分值:20] 您的回答:(空)  (簡答題需要人工評分) package com.interview; /** * 各種排序演算法 */

各種排序演算法的場景以及c++實現(插入排序,希爾排序,氣泡排序快速排序,選擇排序歸併排序

對現有工作並不是很滿意,所以決定找下一個坑。由工作中遇到排序場景並不多,大都是用氣泡排序,太low,面試又經常問到一些排序演算法方面的東西。剛好讓小學妹郵的資料結構也到了。就把各種排序演算法重新總結一下,以作留存。 排序分為內部排序和外部排序,內部排序是在記憶體中排序。外