資料結構排序系列之交換排序(二)

2021-10-05 20:47:01 字數 2035 閱讀 4294

交換排序我們介紹氣泡排序和快速排序(劃分交換排序),核心思想就是通過元素兩兩比較,發現反序時進行交換,直到所有元素都沒有反序為止。

演算法思想:

通過相鄰元素之間的比較和交換來完成。氣泡排序從後往前,進行相鄰元素的兩兩比較和交換。使關鍵字小的元素逐漸從底部移向頂部。

演算法實現:

#include

// r為待排序的陣列,n是陣列的長度

void

bubblesort

(int r,

int n)

j--;}

}}intmain()

;bubblesort

(data,8)

;for

(int i =

0;i<

8; i++

)return0;

}

演算法思想:

從無序區r[low…high]中選擇乙個元素,假設為x,作為排序比較基準。用此基準將無序區分為r[low…i-1]和r[i+1…high]兩個無序區,並使左邊的無序區的元素的關鍵字都小於等於x,使右邊的無序區的元素的關鍵字都大於等於x。而基準x則位於最終排序的位置i上,即r[low…i-1]≤r[i]≤r[i+1…high]。這個過程為一次劃分交換排序。然後再對左右兩個無序區各自進行劃分排序,直到無序區都排好序為止。因為每一次劃分交換排序的過程一樣,只是待排序區間的不同,因此可以採用遞迴演算法來完成。

1.2.1.演算法實現一:

#include

void

quicksort

(int r,

int n,

int i,

int j)

low++;}

}if(low != high)

} r[low]

= x;

// r[high] = x也可以,此時low與high相等

// 遞迴呼叫,完成其他劃分排序交換

if(low -

1>= i)

if(low+

1<= j)

}int

main()

;quicksort

(data,10,

0,9)

;for

(int i =

0; i <

10;i++

)return0;

}

1.2.2演算法實現二:
#include

// 對r[low..high]進行一次劃分交換排序

intpartition

(int r,

int n,

int low,

int high)

if(low < high)

// 向右移動

while

(low < high && r[low]

< x)

if(low < high)

} r[low]

= x;

// r[high] = x也可以

return low;

}// 通過遞迴的方式來完成排序

void

quicksort

(int r,

int n,

int low,

int high)

printf

("\n");

if(p !=-1

)}intmain()

;quicksort

(data,10,

0,9)

;for

(int i =

0; i <

10;i++

)return0;

}

氣泡排序是穩定的,快速排序(劃分交換排序)是不穩定的。冒泡演算法每次只比較和交換相信的元素,因而總的比較次數和移動次數較多,而快速排序的比較和交換是從兩端向中間進行的,每次移動的距離都比較遠,因而總的比較次數和總的移動次數較少。事實上,快速排序有非常好的時間複雜度,它優於其他各種排序演算法。

資料結構 排序之交換排序

本節將兩種交換排序氣泡排序和快速排序 氣泡排序是最簡單的交換排序方法,比較相鄰兩個記錄的關鍵字,將大的放到右邊,小的放到左邊,如圖所示 從而使關鍵字小的左移 大的右移 每一次迴圈最右邊的必定是關鍵字最大的元素,外面再加一層迴圈即可得到有序序列。實現 include using namespace s...

資料結構演算法 排序演算法之交換排序 快速排序

快速排序 1 設定兩個 變數i j,排序開始的時候 i 0,j n 1 2 以第乙個 陣列元素作為關鍵資料,賦值給key,即key a 0 3 從j開始向前搜尋,即由後開始向前搜尋 j 找到第乙個小於key的值a j 將a j 和a i 互換 4 從i開始向後搜尋,即由前開始向後搜尋 i 找到第乙個...

排序專題之交換排序

在交換排序這一類中,分為氣泡排序和快速排序,快速排序是建立在 氣泡排序基礎上的乙個優化,很有意義的乙個排序,在各種acm競賽 以及其他領域中經常被用到 接下來,我們先看一看氣泡排序。氣泡排序基本思想 通過無序區中相鄰記錄關鍵字間的比較和位置的交換,使關鍵字最小的記錄如氣泡一般逐漸往上 漂浮 直至 水...