快速排序是對氣泡排序的一種改進。它的基本思想是通過一趟掃瞄後,使得排序序列的長度能大幅度地減少。通過一趟掃瞄,確保以某個數為基準點的左邊各數都比它小,右邊各數都比它大。然後又用同樣的方法處理它左右兩邊的數,直到基準點的左右只有乙個元素為止。
簡單的說就是
找乙個基準數(待排序的任意數,一般都是選定首元素),把比小於等於基準數的元素放到基準數的左邊,把大於基準數的元素放在基準數的右邊.排完之後,在把基準數的左邊和右邊各看成乙個整體, 左邊:繼續選擇基準數把小於等於基準數的元素放到基準數的左邊,把大於基準數的元素放在基準數的右邊,右邊也是一樣..直到各區間只有乙個數字置.
借用別人的這張,覺得把快排表達的很明顯
定義乙個陣列
nsmutablearray *numberarray = [nsmutablearray arraywithobjects:
[nsnumber numberwithint:7],
[nsnumber numberwithint:12],
[nsnumber numberwithint:3],
[nsnumber numberwithint:45],
[nsnumber numberwithint:20], nil];
宣告乙個方法 傳入排序陣列、開始索引、結束索引
-(void)quicksort:(nsmutablearray *)array startindex:(nsinteger)startindex endindex:(nsinteger)endindex
}[array exchangeobjectatindex:tempindex withobjectatindex:startindex];
[self quicksort:array startindex:startindex endindex:tempindex-1]; //繼續處理左邊的,這裡是乙個遞迴的過程
[self quicksort:array startindex:tempindex+1 endindex:endindex]; //繼續處理右邊的,這裡是乙個遞迴的過程
nslog(@"array %@",array);
}
ios也為我們提供方法讓我們實現對陣列的快排
方法1: nscomparator
nsarray *sortedarray = [numberarray sortedarrayusingcomparator:^nscomparisonresult(id _nonnull obj1, id _nonnull obj2) else
}];nslog(@"%@",sortedarray);
方法2: nssortdescriptor
nssortdescriptor *descriptor = [[nssortdescriptor alloc] initwithkey:nil ascending:yes];//ascending控制公升序還是降序
nsarray *sortarray = [nsarray arraywithobjects:descriptor, nil];
nsarray *sortedarray = [numberarray sortedarrayusingdescriptors:sortarray];
nslog(@"%@",sortedarray);
也可以把這個方法封裝成函式
-(void)changearray:(nsmutablearray *)dicarray orderwithkey:(nsstring *)key
ascending:(bool)yesorno
快速排序的理解
純數字與物件排序,注意物件排序邊界問題 理解 將陣列中的元素大於某個值的放在右邊,小於某個值的放再左邊。然後遞迴,直到low high在返回。在快速排序中,首先要將第乙個元素作為key值 其他從某位起就某位做key值也可 前面設定left為第乙個元素的索引,right為最後乙個元素的索引。一直hig...
快速排序理解
include include stdafx.h define n 7 void print2 int a printf n void sort int data,int left,int right int i left int j right int key data i while i j 左...
快速排序理解
每次處理好 某個 標桿 數字 在 最終 陣列 中的位置。然後 每個 數字 依次 作為標桿數,都找到 自己的 位置。相比 氣泡排序,冒泡 是每次找 最大數字的 位置,找好後 在 不包含最大 數字的 陣列中,再 次找 當前最大數的 位置。而快速 排序 是 找 指定 標桿數 的位置。標桿數 可以是任意乙個...