簡單排序法
這種方式是最笨拙的排序方式 效率最低:
每次排序只能確定一個位置臼氨,直到倒數(shù)第二次 末尾的最小值1才顯示到最后
- (void)logArray {
NSMutableArray * arr = @[@16,@1,@2,@9,@7,@12,@5,@3,@8,@13,@10].mutableCopy;
for (int i = 0; i < arr.count; i++) {
for (int j = i+1; j < arr.count; j++) {
if (arr[i] < arr[j]) {
[arr exchangeObjectAtIndex:i withObjectAtIndex:j];
}
}
[self logArr:arr];
}
}
一只锻、冒泡排序
比較相鄰兩個數(shù),如果后面的比前面的小 則交換位置权烧,然后再與后面的數(shù)比較
- (void)logArrayFunction {
NSMutableArray * arr = @[@16,@1,@2,@9,@7,@12,@5,@3,@8,@13,@10].mutableCopy;
for (int i = 0; i < arr.count; i++) {
for (int j = (int)arr.count-2; j >= i; j--) {
if (arr[j] > arr[j+1]) {
[arr exchangeObjectAtIndex:j withObjectAtIndex:j+1];
}
}
}
}
冒泡改良方式琴庵,避免初始就是排好的序列的方式 做過多的無用循環(huán)比較
- (void)logArrayFunctionNice {
BOOL flag = YES;
NSMutableArray * arr = @[@16,@1,@2,@9,@7,@12,@5,@3,@8,@13,@10].mutableCopy;
for (int i = 0; i < arr.count && flag; i++) {
flag = NO;
for (int j = (int)arr.count-2; j >= i; j--) {
if (arr[j] > arr[j+1]) {
[arr exchangeObjectAtIndex:j withObjectAtIndex:j+1];
flag = YES;
}
}
}
}
二、插入排序法
拿后面一個數(shù)與前面的一個數(shù)做比較妒茬,如果滿足則交換担锤,然后再往前查找
- (void)logInsertionSortingArray {
NSMutableArray * arr = @[@16,@1,@2,@9,@7,@12,@5,@3,@8,@13,@10].mutableCopy;
for (int i = 1; i < arr.count; i++) {
int j = i; /* j是一個坑, 確定坑的位置乍钻,再把數(shù)從坑里取出來肛循,注意順序*/
id temp = arr[i]; /* temp 是從坑里取數(shù)*/
if (arr[i] < arr[i-1]) { /* j > 0 防止越界。寫&&前面效率更高*/
temp = arr[i];
while (j > 0 && [temp intValue] < [arr[j-1] intValue]) {
arr[j] = arr[j-1];
j--;
}
arr[j] = temp;
}
}
}
三团赁、選擇排序法
選擇一個數(shù),然后用這個數(shù)與后面的每一相比較直到遇到比它大的數(shù) 然后交換位置
- (void)logChooseArray {
NSMutableArray * arr = @[@16,@1,@2,@9,@7,@12,@5,@3,@8,@13,@10].mutableCopy;
int min = 0, arrCount = (int)arr.count;
for (int i = 0; i < arrCount-1; i++) {
min = i;
for (int j = i + 1; j < arrCount; j++) {
if (arr[min] > arr[j]) { /*如果有小于當前的最小值的關(guān)鍵字*/
min = j; /*將此關(guān)鍵字的下標賦值給min*/
}
}
if (i != min) { /*若min不等于i谨履,說明找到最小值欢摄,交換*/
[arr exchangeObjectAtIndex:i withObjectAtIndex:min];
}
}
}
//每次循環(huán)打印結(jié)果如下
1 16 2 9 7 12 5 3 8 13 10
1 2 16 9 7 12 5 3 8 13 10
1 2 3 9 7 12 5 16 8 13 10
1 2 3 5 7 12 9 16 8 13 10
1 2 3 5 7 12 9 16 8 13 10
1 2 3 5 7 8 9 16 12 13 10
1 2 3 5 7 8 9 16 12 13 10
1 2 3 5 7 8 9 10 12 13 16
1 2 3 5 7 8 9 10 12 13 16
1 2 3 5 7 8 9 10 12 13 16
1 2 3 5 7 8 9 10 12 13 16
四、快速排序法
數(shù)組選第一個數(shù)笋粟,把比數(shù)小的放到數(shù)的左邊怀挠,比數(shù)大的放到右邊,結(jié)束后對左右兩邊的數(shù)組作重復處理即可害捕。
- (void)quickSortArray:(NSMutableArray *)array withLeftIndex:(NSInteger)leftIndex andRightIndex:(NSInteger)rightIndex
{
if (leftIndex >= rightIndex) {//如果數(shù)組長度為0或1時返回
return ;
}
NSInteger i = leftIndex;
NSInteger j = rightIndex;
//記錄比較基準數(shù)
NSInteger key = [array[i] integerValue];
while (i < j) {
/**** 首先從右邊j開始查找比基準數(shù)小的值 ***/
while (i < j && [array[j] integerValue] >= key) {//如果比基準數(shù)大绿淋,繼續(xù)查找
j--;
}
//如果比基準數(shù)小,則將查找到的小值調(diào)換到i的位置
array[i] = array[j];
/**** 當在右邊查找到一個比基準數(shù)小的值時尝盼,就從i開始往后找比基準數(shù)大的值 ***/
while (i < j && [array[i] integerValue] <= key) {//如果比基準數(shù)小吞滞,繼續(xù)查找
i++;
}
//如果比基準數(shù)大,則將查找到的大值調(diào)換到j的位置
array[j] = array[i];
}
//將基準數(shù)放到正確位置
array[i] = @(key);
/**** 遞歸排序 ***/
//排序基準數(shù)左邊的
[self quickSortArray:array withLeftIndex:leftIndex andRightIndex:i - 1];
//排序基準數(shù)右邊的
[self quickSortArray:array withLeftIndex:i + 1 andRightIndex:rightIndex];
}
NSMutableArray * arr = @[@16,@1,@2,@9,@7,@12,@5,@3,@8,@13,@10].mutableCopy;
[self quickSortArray:arr withLeftIndex:0 andRightIndex:arr.count-1];