思想:挖坑填數,左右分治,遞迴呼叫
如序列a[ ]
將序列中所有比基準數小的數放在基準數左邊,比基準大的數放在右邊
方法
1.設定兩個變數low,high分別指向頭和尾
設a[low]=52 為基準數將其放到a[0]空位置,此時a[1]位置為空
2.先從序列右邊開始探測,high向左移動(high–),直到找到乙個小於基準數(52)的數,a[high]=23被找到(high=9),將23放到前面的空位中,a[1]=a[9]=23,此時a[9]為空。
3.然後從序列左邊探測,low開始向右移動 (low++),直到找到乙個大於基準數(52)的數,a[low]=80被找到(low=3),將80放到後面的空位中,a[9]=a[3]=80,此時a[3]為空
4.繼續從右端未探測部分開始探測(high–),找到乙個,放到前面空位, 再從左邊為探測部分開始探測(low++),找到乙個,放到後面空位。直到所有資料都被探測到,此時把基準數放到中間的乙個空位中,第一趟結束
黃色為被移動的資料
第一趟結果
左右分治
方法
遞迴呼叫函式
小於第一次基準數的一邊(左邊),呼叫此函式,再次挖坑填數,左右分制,直到左邊排好序,大於第一次基準數的一邊(右邊)同理。(呼叫一次就為一趟,左邊排好再排右邊)
演算法**
void
quicksort
(seqlist* p,
int left,
int right)
if(i
while
(i < j && p->data[i]
<= p->data[0]
)if(i
} p->data[i]
= p->data[0]
;printf
("第%d趟:"
,k);
printlist
(*p)
;quicksort
(p, left, i -1)
;quicksort
(p,i+
1,right);}
return
;}
完整**
#include
#define maxlen 100
typedef
int datatype;
typedef
struct
seqlist;
void
initlist
(seqlist *p)
;//初始化
void
addlist
(seqlist *p)
;void
printlist
(seqlist p)
;//輸出
void
quicksort
(seqlist *p,
int left,
int right)
;//快速排序 挖坑填數+分治法
intmain()
void
initlist
(seqlist *p)
void
addlist
(seqlist *p)
printf
("請輸入");
scanf
("%d"
,&x)
; p->data[
++p->length]
=x;printf
("是否繼續新增 y/n");
scanf
(" %c"
,&c);}
while
(c==
'y'||c==
'y')
;return;}
void
printlist
(seqlist p)
printf
("\n");
return;}
void
quicksort
(seqlist* p,
int left,
int right)
if(i
while
(i < j && p->data[i]
<= p->data[0]
)if(i
} p->data[i]
= p->data[0]
;printf
("第%d趟:"
,k);
printlist
(*p)
;quicksort
(p, left, i -1)
;quicksort
(p,i+
1,right);}
return
;}
排序演算法 快速排序演算法
網際網路的大型公司還在火熱招聘中,參與了一次又一次的筆試,都不通過,我還是太菜!作為程式設計人員,需要邁過去 資料結構與演算法 這個坎,畢竟,筆試不會真的很虧,加油吧,少些水,多點實操。一 快速排序演算法思想 從一組資料中找出乙個基準值,一般是選擇中間值作為基準值,然後從左到右將值與基準值進行比較,...
演算法 排序演算法 快速排序
快速排序是對冒泡法排序的一種改進。快速排序演算法 的基本思想是 將所要進行排序的數分為左右兩個部分,其中一部分的所有資料都比另外一 部分的資料小,然後將所分得的兩部分資料進行同樣的劃分,重複執行以上的劃分操作,直 到所有要進行排序的資料變為有序為止。可能僅根據基本思想對快速排序的認識並不深,接下來以...
排序演算法 快速排序
快速排序使用分治法 divide and conquer 策略來把乙個序列 list 分為兩個子串行 sub lists 步驟為 1.從數列中挑出乙個元素,稱為 基準 pivot 2.重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面 相同的數可以到任一邊 在這個分...