iOS 之快速排序

? ? ? ? 單獨(dú)搞一篇文章來(lái)說(shuō)快速排序,是因?yàn)橥瑸镺(N*logN)的幾種排序方法中效率較高,再加上快速排序思想----分治法也確實(shí)實(shí)用。

? ? ? ? 快速排序是C.R.A.Hoare于1962年提出的一種劃分交換排序。它采用了一種分治的策略,通常稱其為分治法(Divide-and-ConquerMethod)。

該方法的基本思想是:

1.先從數(shù)列中取出一個(gè)數(shù)作為基準(zhǔn)數(shù)。

2.分區(qū)過(guò)程,將比這個(gè)數(shù)大的數(shù)全放到它的右邊,小于或等于它的數(shù)全放到它的左邊。

3.再對(duì)左右區(qū)間重復(fù)第二步,直到各區(qū)間只有一個(gè)數(shù)。

分析:以一個(gè)數(shù)組作為示例,取區(qū)間第一個(gè)數(shù)為基準(zhǔn)數(shù)。

初始值,i = 0; j = 7; x = arr[i] = 44;

由于已經(jīng)將arr[0]中的數(shù)保存到X中,可以理解成在數(shù)組arr[0]上挖了個(gè)坑,可以將其它數(shù)據(jù)填充到這來(lái)。

? ? ? ? 從j開(kāi)始向前找一個(gè)比X小或等于X的數(shù)。當(dāng)j=6,符合條件,將arr[6]挖出再填到上一個(gè)坑arr[0]中。這樣一個(gè)坑arr[0]就被搞定了,但又形成了一個(gè)新坑arr[6],再找數(shù)字來(lái)填arr[6]這個(gè)坑。這次從i開(kāi)始向后找一個(gè)大于X的數(shù),當(dāng)i=2,符合條件,將arr[2]挖出再填到上一個(gè)坑中a[6]=a[2]; j--;

? ? ? ? 在這個(gè)過(guò)程中是重要保證與上一個(gè)坑,坑在右邊找最大,坑在左邊找最小。

執(zhí)行完上邊數(shù)組變?yōu)椋?/p>

當(dāng)前值,i = 2;j = 5; X = 44;?

再重復(fù)上邊的步驟,先從后向前找,在從前向后找。

從j開(kāi)始找,當(dāng)j = 1,符合條件,但是j <= i ,所以arr[1]不變,將X填入坑內(nèi),arr[2] = X;

執(zhí)行完上邊數(shù)組變?yōu)椋?br>

到此我們發(fā)現(xiàn)arr[2]前邊的都小于他,后邊的都大于他。因此再對(duì)a[0…2]和a[3…7]這二個(gè)子區(qū)間重復(fù)上述步驟就可以了。

以下是以中間值作為基準(zhǔn)數(shù)的代碼:

- (NSArray*)insertion_sortWithArray:(NSMutableArray*)array low:(NSInteger)low high:(NSInteger)high {? ?

?if(array == nil || array.count == 0){? ? ? ? return nil;? ? }? ? if (low >= high) {? ? ? ? return nil;? ? }? ??

? ? //取中值??

? NSInteger middle = low + (high - low)/2;? ?

? NSNumber *prmt = array[middle];? ?

? NSInteger i = low;??

? NSInteger j = high;? ??

? ? //開(kāi)始排序,使得leftprmt

while (i <= j) {

//? ? ? ? while ([array[i] compare:prmt] == NSOrderedAscending) {? 該行與下一行作用相同

while ([array[i] intValue] < [prmt intValue]) {

i++;

}

//? ? ? ? while ([array[j] compare:prmt] == NSOrderedDescending) { 該行與下一行作用相同

while ([array[j] intValue] > [prmt intValue]) {

j--;

}

if(i <= j){

[array exchangeObjectAtIndex:i withObjectAtIndex:j];

i++;

j--;

}

}

if (low < j) {

[self insertion_sortWithArray:array low:low high:j];

}

if (high > i) {

[self insertion_sortWithArray:array low:i high:high];

}

return array;

}

輸出結(jié)果為:

NSMutableArray *a= @[@6, @2, @4, @1, @5, @9].mutableCopy;

NSLog(@"%@\n",a);

NSArray *sortA = [self insertion_sortWithArray:a low:0 high:a.count - 1];

NSLog(@"%@",sortA);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容