交換排序我們介紹氣泡排序和快速排序(劃分交換排序),核心思想就是通過元素兩兩比較,發現反序時進行交換,直到所有元素都沒有反序為止。
演算法思想:
通過相鄰元素之間的比較和交換來完成。氣泡排序從後往前,進行相鄰元素的兩兩比較和交換。使關鍵字小的元素逐漸從底部移向頂部。
演算法實現:
#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競賽 以及其他領域中經常被用到 接下來,我們先看一看氣泡排序。氣泡排序基本思想 通過無序區中相鄰記錄關鍵字間的比較和位置的交換,使關鍵字最小的記錄如氣泡一般逐漸往上 漂浮 直至 水...