快速排序是一種不穩定的排序演算法,也就是說,多個相同的值的相對位置也許會在演算法結束時產生變動
該方法的基本思想是:
1.先從數列中取出乙個數作為基準數。
2.分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。
3.再對左右區間重複第二步,直到各區間只有乙個數。
以乙個陣列作為示例,取區間第乙個數為基準數。01
2345
6789
726
5788
6042
8373
4885
初始時,i = 0; j =9; x = a[i] = 72
由於已經將a[0]中的數儲存到x中,可以理解成在陣列a[0]上挖了個坑,可以將其它資料填充到這來。
從j開始向前找乙個比x小或等於x的數。當j=8,符合條件,將a[8]挖出再填到上乙個坑a[0]中。a[0]=a[8];i++; 這樣乙個坑a[0]就被搞定了,但又形成了乙個新坑a[8],這怎麼辦了?簡單,再找數字來填a[8]這個坑。這次從i開始向後找乙個大於x的數,當i=3,符合條件,將a[3]挖出再填到上乙個坑中a[8]=a[3];j–;
陣列變為:01
2345
6789
4865788
6042
8373
8885
i = 3; j =7; x=72
再重複上面的步驟,先從後向前找,再從前向後找。
從j開始向前找,當j=5,符合條件,將a[5]挖出填到上乙個坑中,a[3] = a[5]; i++;
從i開始向後找,當i=5時,由於i==j退出。
此時,i = j = 5,而a[5]剛好又是上次挖的坑,因此將x填入a[5]。
陣列變為:01
2345
6789
4865742
6072
8373
8885
可以看出a[5]前面的數字都小於它,a[5]後面的數字都大於它。因此再對a[0…4]和a[6…9]這二個子區間重複上述步驟就可以了。
對挖坑填數進行總結
1.i =l; j = r; 將基準數挖出形成第乙個坑a[i]。
2.j–由後向前找比它小的數,找到後挖出此數填前乙個坑a[i]中。
3.i++由前向後找比它大的數,找到後也挖出此數填到前乙個坑a[j]中。
4.再重複執行2,3二步,直到i==j,將基準數填入a[i]中。
思想:每一趟排序將會選擇出最小的(或者最大的)值,順序放在已排好序的數列的後面
思想:將乙個記錄插入到乙個已排好序的有序表中,從而得到乙個新的、記錄增1的有序表。預設將第乙個元素看為有序表,然後依次插入後邊的元素
注意:這裡插入元素的時候預設的策略是從後向前看,找第乙個比自己小的;而不是從前向後看,找第乙個比自己大的
思路比較簡單:
將序列當中的左右元素,依次比較,保證右邊的元素始終大於左邊的元素;
( 第一輪結束後,序列最後乙個元素一定是當前序列的最大值;)
對序列當中剩下的n-1個元素再次執行步驟1。
對於長度為n的序列,一共需要執行n-1輪比較
1234567
891011
1213
1415
1617
1819
2021
2223
2425
2627
2829
3031
3233
3435
3637
3839
4041
4243
4445
4647
4849
5051
5253
5455
5657
5859
6061
6263
6465
6667
6869
7071
7273
7475
7677
7879
8081
8283
8485
8687
8889
9091
9293
9495
9697
9899
100101
102103
104105
#include獨歸遠,採用署名-非商業性使用-相同方式共享using
namespace
std;
void
swap
(int *a,int *b)
//快速 比基數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。
void
quicksort
(int *p,int l,int r)
if(i
while(i
if(i
}p[i]=index;
quicksort(p,l,i-1);
quicksort(p,i+1,r);}}
//冒泡 一次比較兩個元素,如果他們的順序錯誤就將他們進行交換
void
maopaosort
(int *p,int len)}}
return ;
}//選擇 直接選擇排序每一趟選擇出最小的值
void
selectsort
(int *p,int len)}}
}//插入 將乙個記錄插入到已排好序的有序表中,從而得到乙個新的、記錄數增1的有序表
void
insertsort
(int *p,int len)
p[j+1]=index;}}
intmain
(),k;
int len=sizeof(array)/sizeof(int);
cout
<
<
for(k=0;k
cout
<
cout
<
//quicksort(array,0,len-1);
//maopaosort(array,len);
//selectsort(array,len);
insertsort(array,len);
cout
<
<
for(k=0;k
cout
<
cout
<
return0;}
cc by-nc-sa 3.0許可協議資料結構之排序和查詢資料結構之排序和查詢/
賞 謝謝你請我吃糖果
資料結構 排序和查詢
氣泡排序 void bubblesort elemtype r,int n,int comp num,int move num if flag 0 break 快速排序 void quicksort elemtype r,int left,int right,int comp num,int mov...
資料結構之查詢
date 08 07 11 descript 折半查詢,插入跟刪除演算法 public class binaryinsertex extends seqlist public binaryinsertex int n public void create catch exception ex pub...
資料結構之查詢
一 靜態查詢 有序表查詢 平均查詢長度 特點 1 折半查詢 log n 1 1 只是適用於有序表,且限於順序儲存結構 線性鍊錶無法進行折半查詢。2 斐波那契查詢 o logn 平均效能比折半好,但最壞效能比折半差 分割時只需進行加減運算,適用於關鍵字均勻分布的表 對錶長較大的順序表,其效能比折半好 ...