快速排序的實現與注意點

2022-08-25 15:30:41 字數 1266 閱讀 9409

先上實現了的c++**:

1 #include  2 #include  3 #include  4 #include  5

using

namespace

std;

6const

int maxn = 100;7

inta[maxn], n;

8void quick_sort(int left, int

right)

12int i = left, j = right, key =a[left];

13while(i !=j)

17//

尋找分界點右邊比key小的數

18while(i < j && a[i] <=key)

21//

尋找分界點左邊比key大的數

22if(i !=j)

25//

如果找到了,則交換26}

27swap(a[left], a[i]);

28//

將key放到分界點的位置上,之後進行遞迴處理分界點兩側的資料

29 quick_sort(left, i - 1

);30 quick_sort(i + 1

, right);31}

32int

main()

38 quick_sort(0, n - 1

);39

for(int i = 0; i < n; i++)

42 printf("\n"

);43

return0;

44 }

下邊說說兩個注意點:

(1)關於quick_sort函式第一句,為什麼要判斷left是否大於right?

考慮這樣一組輸入資料:

10279 786 373 946 460 552 698 754 519 759

這組資料就是為什麼要有if(left > right)的原因,因為第一輪下來以後,i、j均為0(279比其他所有數都小),之後遞迴處理的時候,左邊的區間為(0, -1),不合法!

(2)為什麼每一輪查詢左右兩部分的時候,都要從右端開始(下標j)?

每一輪兩邊找的時候,都從右邊開始的原因是為了保證最終a[i]和a[left]交換的時候,a[i]>=a[left]

比如考慮這樣一組資料:

67 1 2 3 4 8

這樣如果從左邊先找,第一輪下來後,將會使得i為5,交換a[0]和a[5],左邊區間為0-4,右邊沒有,但是左邊區間有乙個8,比7大!

快速排序 三個注意點

o n logn 的快排,交換啊a i 和a j 之前,一定要保證i每次遞迴都要保證l includeusing namespace std int a 100 int n 三個注意點,每個都必須要寫對,否則就報錯,一定要保證l a p j i while a i a p i 這裡保證iif i s...

Java 氣泡排序與快速排序的實現

1 基於交換思想的排序演算法 2 從一端開始,逐個比較相鄰的兩個元素,發現倒序即交換。3 一次遍歷,一定能將其中最大 小 的元素交換到其最終位置上 static void bubble sort intarray system.out.print 第 i 1 次排序的結果 for int c 0 c...

點集排序(快速排序)

點集排序演算法,首先是要定義單個點如何確定大小,它不像數字那樣是一維的,點是乙個二維,所以在定義點的時候要定義點如何比較大小。點的大小一般來說,都是從左到右,從下到上的乙個順序,也就是說首先比較x方向,然後再比較y方向。下面是我自己定義的乙個點的類 class doxpoint2d 介面 快速排序 ...