/**
二分查找
@param array 需要查找的數組且必須爲有序數組
@param key 目標元素
@param lower 數組起始下標
@param upper 數組末尾下標
@return 目標元素在數組的下標
*/
- (NSInteger)twoPointLookup:(NSArray *)array target:(NSInteger)key lower:(NSInteger)lower upper:(NSInteger)upper
{
if (lower < upper) {
//獲取中間數組下標
NSInteger middle = (lower+upper)/2;
//與目標元素相等則直接返回
if (key == [array[middle] integerValue]) {
return middle;
}
//目標元素小於中間值
else if (key < [array[middle] integerValue]) {
//遞歸調用,起始下標爲lower,末尾下標則改爲middle-1
return [self twoPointLookup:array target:key lower:lower upper:middle-1];
}
else {
//遞歸調用,起始下標則改爲middle+1,末尾下標爲upper
return [self twoPointLookup:array target:key lower:middle+1 upper:upper];
}
}
else {
return -1;
}
}
//直接插入排序
- (void)insertSort:(NSMutableArray *)array
{
for (int i = 1; i < array.count; i++) {
int j = i;
//記錄第下個元素
NSInteger temp = [array[i] integerValue];
//進行升序排序
while (j>0 && temp < [array[j-1] integerValue]) {
//把大於temp的值放到temp的位置
[array replaceObjectAtIndex:j withObject:array[j-1]];
j--;
}
//然後把temp的值放在前面的位置
[array replaceObjectAtIndex:j withObject:[NSNumber numberWithInteger:temp]];
}
}
//簡單選擇排序
- (void)selectionSort:(NSMutableArray *)array
{
for (int i = 0; i < array.count-1; i++) {
for (int j = i+1; j < array.count; j++) {
//進行升序排序
if ([array[i] integerValue] > [array[j] integerValue]) {
[self swap:array left:i right:j];
}
}
}
}
//冒泡排序
- (void)bubbleSort:(NSMutableArray *)array
{
//比較的輪數
for (int i = 0; i < array.count-1; i++) {
//每輪比較的次數
for (int j = 0; j<array.count-1-i; j++) {
//進行升序排序
if ([array[j] integerValue] > [array[j+1] integerValue]) {
//交換元素
[self swap:array left:j right:j+1];
}
}
}
}
- (void)sortArray:(NSMutableArray *)array left:(NSInteger)left right:(NSInteger)right
{
if (left >= right) {
return;
}
NSInteger i = left;
NSInteger j = right;
NSInteger key = [array[i] integerValue];
while (i<j) {
while (i<j && key <= [array[j] integerValue]) {
j--;
}
[self swap:array left:i right:j];
while (i<j && key >= [array[i] integerValue]) {
i++;
}
[self swap:array left:j right:i];
}
[self sortArray:array left:left right:i-1];
[self sortArray:array left:i+1 right:right];
}
//交換
- (void)swap:(NSMutableArray *)array left:(NSInteger)left right:(NSInteger)right
{
NSNumber *temp;
if (array != nil && array.count > 0) {
temp = array[left];
array[left] = array[right];
array[right] = temp;
}
}
/**
快速排序
@param array 需要排序的數據集合,必須是可變數組,因爲不可變數組不能進行元素交換
@param left 該數組的起始下標
@param right 該數組的末尾下標
*/
- (void)fastSortingArray:(NSMutableArray *)array low:(NSInteger)left high:(NSInteger)right
{
if (left >= right) {
return;
}
NSInteger i = left;
NSInteger j = right;
NSInteger key = [array[left] integerValue];
while (i<j) {
while (i<j && key <= [array[j] integerValue]) {
j--;
}
array[i] = array[j];
while (i<j && key >= [array[i] integerValue]) {
i++;
}
array[j] = array[i];
}
array[i] = [NSNumber numberWithInteger:key];
[self fastSortingArray:array low:left high:i-1];
[self fastSortingArray:array low:i+1 high:right];
}