快速排序的點點滴滴

2021-08-05 19:08:59 字數 2178 閱讀 4180

好了,廢話不多說,直接來乾貨。

首先說下快速排序的思想,一般網上說的都是horno(horno這個人提出來的演算法)法,我這裡除此之外還介紹另外的兩種方法。

//way1:horno 法

1、找乙個基準值key(一般三數取中法),本題中基準值為陣列中最右的元素,再定義兩個指標begin(指向首元素)和end(指向尾元素)

2、begin從前往後走找比基準值key大的元素(找到後停下),end從後往前走找比基準值小的元素(找到後也停下),

然後,交換array[begin]和array[end],依次迴圈操作。

3、當begin與end相遇,將array[begin]或array[end]與基準值交換。

**:演算法思想:

1、找乙個基準值key(一般三數取中法),本題中基準值為陣列中最右的元素,再定義兩個指標begin(指向首元素)和end(指向尾元素)

2、begin從前往後走找比基準值key大的元素(找到後停下),end從後往前走找比基準值小的元素(找到後也停下),

然後,交換array[begin]和array[end],依次迴圈操作。

3、當begin與end相遇,將array[begin]或array[end]與基準值交換。*/

int partion1(int *array,int left,int right)

if (begin!=right)//防止自己和自己交換,即使自己和自己交換不會出錯,但是會多執行以此交換函式,降低效率

std::swap(array[begin], array[right]);

return begin;

}//way2: 挖坑法

1、定義begin和end分別指向資料的第乙個元素和最後乙個元素,基準值key為陣列最後乙個元素,array[end]元素的位置為乙個坑

2、begin從前往後走,找比key大的值,找到之後,將array[begin]賦值給array[end],填充end位置的坑,此時begin位置為乙個坑

3、end從後往前走,找比key小的值,找到之後,將array[end]賦值給array[begin],填充begin位置的坑,此時end位置為乙個新的坑

4、此類方法依次填坑,當begin和end相遇,則迴圈結束,將key的值填最後乙個坑。

int partion2(int *array, int left, int right)

while (beginarray[end] >= key)//注意迴圈內部條件

end--;

if (beginarray[begin] = array[end];

begin++;

}

}if (begin != right)//防止自己和自己交換,即使自己和自己交換不會出錯,但是會多執行以此交換函式,降低效率

std::swap(array[begin], key);

array[begin] = key;

return begin;

}//way:3前後指標法

演算法思想:

1、選擇乙個基準值key,定義兩個指標ppre和ppcur(ppre指向ppcur的前乙個位置),ppre和ppcur同時走,當ppcur標記的元素比key大時,只有ppcur繼續向前走(此時ppre停下來),當ppcur走到標記的元素比ppre小時,ppcur停下,此時交換array[ppcur]和array[ppre+1],然後,ppre往前走一步,ppcur繼續往前走。

2、當pcur走出界了,則將ppre+1位置的值與key交換。

int partion3(int *array, int left, int right)

ppcur++;

}swap(array[right], array[++ppre]);

return ppre;}/

void quicksort(int *array,int left,int right )

}void quicksortnor(int *array, int size)

}}/分析:快速排序

待排資料是公升序(降序),需要用快速排序來排成降序(公升序)的情況下

效能是最差的,可以採用三數取中間法來優化(三數可能相等,但是概率小)

快速排序在最好的情況下是o(nlogn),最壞的情況下是o(n^2),平均的情況下是o(nlogn),當然了,它是不穩定的排序。

acm 點點滴滴

qsort排序方法 六種qsort排序方法 本文中排序都是採用的從小到大排序 一 對int型別陣列排序 int num 100 sample int cmp const void a const void b qsort num,100,sizeof num 0 cmp 二 對char型別陣列排序 ...

sizeof 點點滴滴

1.靜態變數是存放在全域性資料區中的,sizeof計算棧中分配的大小,所以類或結構體中的靜態變數時不會計算在sizeof內的!2.sizeof和strlen的區別 1 sizeof操作符的結果型別是size t,它在標頭檔案中的typedef為unsigned int型別。該型別保證能容納實現所建立...

Elastic search點點滴滴

在打造集中化日誌那篇中,稍微提了下elastic search。elk打造集中化日誌 elastic search是elk的核心,寫的時候重點也放在它上面,不過還是覺得深度挖掘得不是太夠,所以決定再另寫一篇重點介紹下elastic search。正如elastic的本義一樣,es就是為擴充套件而生,...