快速排序的几种方式
首先需要创建交换数组中元素的方法
//交换数组中的两个数- (void)swap:(NSMutableArray *)sourceArr numI:(int)i numJ:(int)j{ NSNumber *temp; temp = sourceArr[i]; sourceArr[i] = sourceArr[j]; sourceArr[j] = temp;}复制代码
快速排序方法一
//快速排序(基本的思想就是,i指向最左边元素的下一个元素,j指向最后一个元素,然后从右向左寻找第一个比中轴元素小的元素,从左向右寻找一个比中轴元素大的元素,两者交换位置,当i>j的时候,交换中轴元素和j的位置,最后通过递归对中轴前后的元素分别进行递归)- (void)quickSort:(NSMutableArray *)sourceArr indexL:(int)indexL indexR:(int)indexR{ //递归的边界条件 if (indexL < indexR) { //获取最左边的元素作为中轴元素 int pio = [sourceArr[indexL] intValue]; int i = indexL + 1; int j = indexR; while (i <= j) { //先从右往左查找 while (i <= j && [sourceArr[j] intValue] > pio) { j--; } //从左往右查找 while (i <= j && [sourceArr[i] intValue] <= pio) { i++; } if (i < j) { //交换两个数 [self swap:sourceArr numI:i numJ:j]; i++; j--; } } //最后一次将j的位置的元素与中轴元素进行交换 [self swap:sourceArr numI:indexL numJ:j]; //递归调用,对左边元素按相同的方式依次进行排序 [self quickSort:sourceArr indexL:indexL indexR:j - 1]; //递归调用,对右边元素按相同的方式依次进行排序 [self quickSort:sourceArr indexL:j + 1 indexR:indexR]; }}复制代码
快速排序方法二
//快速排序方法2(将最左边的元素作为中轴元素,先从后往前查找出当前比中轴元素小的元素,交换两者位置,然后从前往后查找出比当前中轴元素大的元素,交换两者位置,直到i和j相等,此处就是最终中轴的位置,然后对中轴前后的元素分别进行递归)- (void)quickSort2:(NSMutableArray *)sourceArr indexL:(int)indexL indexR:(int)indexR{ //递归的边界 if (indexL < indexR) { //获取中轴元素 int pio = [sourceArr[indexL] intValue]; int i = indexL; int j = indexR; while (i < j) { //从后往前查找小于中轴元素的元素 while (i < j && [sourceArr[j] intValue] > pio) { j--; } //将j位置的元素赋值给i sourceArr[i] = sourceArr[j]; //从前往后查找大于中轴元素的元素 while (i < j && [sourceArr[i] intValue] <= pio) { i++; } //将i位置的元素赋值给j sourceArr[j] = sourceArr[i]; } //当i和j指向同一个位置的时候,将中轴元素的值赋值给i sourceArr[i] = @(pio); //递归遍历 [self quickSort2:sourceArr indexL:indexL indexR:i - 1]; [self quickSort2:sourceArr indexL:i + 1 indexR:indexR]; }}复制代码
快速排序方法三
//快速排序方法3(将最左边的元素作为中轴元素,将i指向中轴元素,j指向中轴元素的下一个未知元素,判断j指向的元素是否比中轴元素小,如果小,则将i++,然后交换j和i元素的位置,如果大于,则j向后移动一位)- (void)quickSort3:(NSMutableArray *)sourceArr indexL:(int)indexL indexR:(int)indexR{ if (indexL < indexR) { //获取中轴元素 int pio = [sourceArr[indexL] intValue]; int i = indexL; int j = indexL + 1; while (j <= indexR) { //判断j位置的元素的大小 if ([sourceArr[j] intValue] <= pio) { i++; //交换i和j [self swap:sourceArr numI:i numJ:j]; j++; }else{ j++; } } //交换i和中轴元素的位置,将中轴元素放在指定的位置上 [self swap:sourceArr numI:indexL numJ:i]; //递归左边的数据 [self quickSort3:sourceArr indexL:indexL indexR:i - 1]; [self quickSort3:sourceArr indexL:i + 1 indexR:indexR]; }}复制代码
快速排序方法四
//快速排序算法4(定义一个cur和pre,cur指向最左边的位置,pre指向cur的前一个位置,key表示最后一个位置,cur和pre同时往前走,当遇见cur的值比key大时,cur和pre之间的距离会拉大,当cur的值比key小时,交换cur和pre的位置,然后继续往后移动,当cur移动到key的位置时,交换pre和key的位置)- (void)quickSort4:(NSMutableArray *)sourceArr indexL:(int)indexL indexR:(int)indexR{ if (indexL < indexR) { int key = [sourceArr[indexR] intValue]; int cur = indexL; int pre = cur - 1; while (cur < indexR) { //如果找到小于key的值,并且cur和pre之间有距离的时候 while ([sourceArr[cur] intValue] < key && ++pre != cur) { //交换pre和cur的数据 [self swap:sourceArr numI:cur numJ:pre]; } ++cur; } [self swap:sourceArr numI:++pre numJ:indexR]; //递归前一部分和后一部分的数据 [self quickSort4:sourceArr indexL:indexL indexR:pre - 1]; [self quickSort4:sourceArr indexL:pre + 1 indexR:indexR]; }}复制代码
冒泡排序
//冒泡排序,比较相邻的两个元素- (void)bubblingSort:(NSMutableArray *)sourceArr{ for (int i = 0; i < sourceArr.count - 1; i++) { for (int j = 0; j < sourceArr.count - i - 1; j++) { if ([sourceArr[j] intValue] > [sourceArr[j + 1] intValue]) { [self swap:sourceArr numI:j numJ:j + 1]; } } }}复制代码