基本思想將陣列劃分為兩個部分,然後分別對兩個部分進行排序;首先隨機選q[left]作為劃分元素,這個元素劃分後將在最開始的位置上,從陣列的右端開始掃瞄,直到找到乙個小於劃分元素的元素,再從素組的左端開始掃瞄,直到找到乙個大於劃分元素的元素,使掃瞄停止的兩個元素,顯然在最終的素組中是位置相反,於是交換這兩個數的元素,繼續這一過程,這樣就可以保證素組位於左側的指標的元素都比劃分元素小,位於右側指標的元素都比劃分元素大,然後再將左右兩段分別遞迴排序。
基本步驟1.確定分界點(可以選擇中間位置值或者隨機位置值)
2.調整區間使分界點左側值不大於分界點值,分界點右側值不小於分界點值
3.遞迴處理分界點左右兩側區間
基本模組**於yxc
void
quick_sort
(int q,
int l,
int r)
}quick_sort
(q, l, j)
;quick_sort
(q, j +
1, r)
;}
細節注意1.i, j 都要從兩端外一格開始,確保移動時能夠指向真正的邊界
2.注意邊界問題
經典例題1、給定你乙個長度為n的整數數列。
請你使用快速排序對這個數列按照從小到大進行排序。
並將排好序的數列按順序輸出。
輸入格式
輸入共兩行,第一行包含整數 n。
第二行包含 n 個整數(所有整數均在1~109範圍內),表示整個數列。
輸出格式
輸出共一行,包含 n 個整數,表示排好序的數列。
資料範圍
1≤n≤100000
輸入樣例:
53 1 2 4 5
輸出樣例:
1 2 3 4 5
c語言解答
2、給定乙個長度為n的整數數列,以及乙個整數k,請用快速選擇演算法求出數列的第k小的數是多少。#include
#include
#define n 100010
int n;
int q[n]
;void
quick_sort
(int q,
int l,
int r)
}quick_sort
(q, l, j)
;//對分界點左側進行遞迴排序
quick_sort
(q, j +
1, r)
;//對分界點右側進行遞迴排序
}int
main()
輸入格式
第一行包含兩個整數 n 和 k。
第二行包含 n 個整數(所有整數均在1~109範圍內),表示整數數列。
輸出格式
輸出乙個整數,表示數列的第k小數。
資料範圍
1≤n≤100000,
1≤k≤n
輸入樣例:
5 32 4 1 5 3
輸出樣例:
3
#include
#include
#define n 100010
int n,k;
int q[n]
;void
quick_sort
(int q,
int l,
int r)
}quick_sort
(q, l, j)
;//對分界點左側進行遞迴排序
quick_sort
(q, j +
1, r)
;//對分界點右側進行遞迴排序
}int
main()
#include
using
namespace std;
const
int n =
100010
;int q[n]
;int
quick_sort
(int q,
int l,
int r,
int k)
if(j - l +
1>= k)
return
quick_sort
(q, l, j, k)
;else
return
quick_sort
(q, j +
1, r, k -
(j - l +1)
);}int
main()
39785
/
分治 快速排序
快速排序陣列元素的思想 1 設k a 0 將k挪到適當位置,使得比k小的元素都在k左邊,比k大的元素都在k右邊,和k相等的,不關心在k左右出現均可 o n 時間完成 2 把k左邊的部分快速排序 3 把k右邊的部分快速排序 class program quicksort a,0,a.length 1 ...
分治 快速排序
快速排序陣列元素的思想 1 設k a 0 將k挪到適當位置,使得比k小的元素都在k左邊,比k大的元素都在k右邊,和k相等的,不關心在k左右出現均可 o n 時間完成 2 把k左邊的部分快速排序 3 把k右邊的部分快速排序 class program quicksort a,0,a.length 1 ...
快速排序 分治
我之前有寫過相關快速排序的,但是因為當時對遞迴和分治的思維還是不夠熟悉。所以對快速排序一知半解,現在再來做乙個總結 首先快速排序步驟如下 1,設k a 0 將k挪到適當的位置,使得比k小的元素在k的左邊,比k大的元素在k的右邊,和k是相等的,不關心在k左右均可。2,對k的左邊進行快速排序 3,對k的...