最開始學習程式設計,遇到排序問題,一般都是用冒泡法,因為冒泡法好理解,**量少。但是這種演算法時間複雜度高,當需要排序的元素較多時,程式執行時間很長,因此產生了快速排序演算法。該演算法的實現可分為以下幾步:
1. 在陣列中選乙個基準數(通常為陣列第乙個);
2. 將陣列中小於基準數的資料移到基準數左邊,大於基準數的移到右邊;
3. 對於基準數左、右兩邊的陣列,不斷重複以上兩個過程,直到每個子集只有乙個元素,即為全部有序。
例如有一需要排序的陣列為:23,45,17,11,13,89,72,26,3,17,11,13(從小到大排序):
選取陣列第乙個數23為基準數,存入temp變數中,從陣列的左右兩邊界向中間進行遍歷,定義兩個指標 i 和 j,i 最開始指向陣列的第乙個元素,j 最開始指向陣列的最後乙個元素。指標 i 從左向右移動,指標 j 從右向左移動。先移動 j 指標(從右忘左移),當 j 指向的數大於基準數時,略過,j 繼續往左移動,直到遇到小於等於基準數的數arr[j],將arr[j]填入arr[i]中;再移動 i 指標,當 i 指向的數小於等於基準數時,略過,i 繼續往右移動,直到遇到不比基準數小的數arr[i],將arr[i]填入arr[j]中;再移動 i 指標,再移動 j 指標...(輪換移動),直到 i 和 j 指標相遇,此時將temp(基準數)填入arr[i]中即完成演算法的第2個步驟。接下來分別將基準數左邊和右邊的陣列按照以上方法進行聚合,直到每個子集只有乙個元素,即排序完成。
可能描述得有些抽象,接下來用圖一步一步的示意:
將陣列第乙個數23賦給temp變數,指標 i 指向陣列第乙個元素,指標 j 指向陣列最後乙個元素
從 j 開始遍歷(從右往左),遇到13時,因為13<=temp,因此將arr[j]填入arr[i]中,即此時指標 i 指向的數為13;
再從 i 遍歷(從左往右),遇到45時,因為45>temp,因此將arr[i]填入arr[j]中,此時指標 j 指向的數為45;
繼續從 j 遍歷,遇到11時,因為11<=temp,因此將arr[j]填入arr[i]中,即此時指標 i 指向的數為11;
從 i 遍歷,遇到89時,因為89>temp,因此將arr[i]填入arr[j]中,此時指標 j 指向的數為89;
從 j 遍歷,遇到17時,因為17<=temp,因此將arr[j]填入arr[i]中,即此時指標 i 指向的數為17;
從 i 遍歷,遇到72時,因為72>temp,因此將arr[i]填入arr[j]中,此時指標 j 指向的數為72;
從 j 遍歷,遇到3時,因為3<=temp,因此將arr[j]填入arr[i]中,即此時指標 i 指向的數為3;
從 i 遍歷,遇到26時,因為26>temp,因此將arr[i]填入arr[j]中,此時指標 j 指向的數為26;
從 j 遍歷,和 i 重合;
將 temp(基準數23)填入arr[i]中。
此時完成演算法的第2個步驟,接下來將23左邊和右邊的子區間分別用以上方法進行排序,直到區間只有乙個元素即排序完成。
**如下:
// 快速排序演算法
#include "stdafx.h"
#includeusing namespace std;
//快速排序演算法(從小到大)
//arr:需要排序的陣列,begin:需要排序的區間左邊界,end:需要排序的區間的右邊界
void quicksort(int *arr,int begin,int end)
{ //如果區間不只乙個數
if(begin < end)
{ int temp = arr[begin]; //將區間的第乙個數作為基準數
int i = begin; //從左到右進行查詢時的「指標」,指示當前左位置
int j = end; //從右到左進行查詢時的「指標」,指示當前右位置
//不重複遍歷
while(i < j)
{ //當右邊的數大於基準數時,略過,繼續向左查詢
//不滿足條件時跳出迴圈,此時的j對應的元素是小於基準元素的
while(itemp)
j--;
//將右邊小於等於基準元素的數填入右邊相應位置
arr[i] = arr[j];
//當左邊的數小於等於基準數時,略過,繼續向右查詢
//(重複的基準元素集合到左區間)
//不滿足條件時跳出迴圈,此時的i對應的元素是大於等於基準元素的
while(i
執行結果如下:
排序演算法 快速排序演算法
網際網路的大型公司還在火熱招聘中,參與了一次又一次的筆試,都不通過,我還是太菜!作為程式設計人員,需要邁過去 資料結構與演算法 這個坎,畢竟,筆試不會真的很虧,加油吧,少些水,多點實操。一 快速排序演算法思想 從一組資料中找出乙個基準值,一般是選擇中間值作為基準值,然後從左到右將值與基準值進行比較,...
演算法 排序演算法 快速排序
快速排序是對冒泡法排序的一種改進。快速排序演算法 的基本思想是 將所要進行排序的數分為左右兩個部分,其中一部分的所有資料都比另外一 部分的資料小,然後將所分得的兩部分資料進行同樣的劃分,重複執行以上的劃分操作,直 到所有要進行排序的資料變為有序為止。可能僅根據基本思想對快速排序的認識並不深,接下來以...
演算法設計 快速排序 隨機快速排序演算法
1.演算法流程 快速排序的時間複雜性分析 1.最壞情況劃分 當劃分產生的兩個子問題分別包含了n 1個元素和0個元素時,快速排序是最壞情況,假如每次遞迴呼叫,總是出現最不平衡劃分,這是最不平衡劃分。劃分操作時間複雜度為 n 則演算法執行時間的遞迴表示式為t n t n 1 t 0 n 利用代入法可以求...