好了,廢話不多說,直接來乾貨。
首先說下快速排序的思想,一般網上說的都是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就是為擴充套件而生,...