資料結構之排序和查詢

2021-09-13 02:32:32 字數 3420 閱讀 5671

快速排序是一種不穩定的排序演算法,也就是說,多個相同的值的相對位置也許會在演算法結束時產生變動

該方法的基本思想是:

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輪比較

123

4567

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 平均效能比折半好,但最壞效能比折半差 分割時只需進行加減運算,適用於關鍵字均勻分布的表 對錶長較大的順序表,其效能比折半好 ...