博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OC方式简单实现几种快速排序和冒泡排序
阅读量:6271 次
发布时间:2019-06-22

本文共 4390 字,大约阅读时间需要 14 分钟。

快速排序的几种方式

首先需要创建交换数组中元素的方法

//交换数组中的两个数- (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];            }        }    }}复制代码

转载于:https://juejin.im/post/5ce79004f265da1bb564d2e9

你可能感兴趣的文章
python 金融分析学习
查看>>
授人以渔不如授人以鱼
查看>>
matlab练习程序(图像Haar小波变换)
查看>>
【Java】从域名得到ip
查看>>
Mysql索引会失效的几种情况分析
查看>>
LVM逻辑卷
查看>>
zoj3591 Nim(Nim博弈)
查看>>
canvas绘图
查看>>
poj - 3039 Margaritas on the River Walk
查看>>
bootstrap(5)关于导航
查看>>
Aptana插件在eclipse中安装
查看>>
jQuery-数据管理-删除事件
查看>>
下载器简单实例
查看>>
java实现分页工具类(JDBC)
查看>>
欧几里德算法与扩展欧几里德算法
查看>>
Tinkoff Internship Warmup Round 2018 and Codeforces Round #475 (Div. 2)
查看>>
通过kafka提供的命令来查看offset消费情况
查看>>
oracle数据库从入门到精通之四
查看>>
自定义圆形图片控件
查看>>
sharepoint 2013 补丁升级步骤
查看>>