OC实现的4种排序又来了!

4种排序分别是:快速排序、冒泡排序、选择排序、插入排序,其他的我就不写了,因为OC里的数组中不能存放基本数据类型,如int不能存放,只能放对象,所以所有的数据我用了NSNumber类型,一开始我直接用>、=、<来比较结果排序后还是乱七八糟,后来想起来不能这么比较,对象的比较,可以用compare方法,结果与NSComparisonResult这个枚举类型的数据比较大小就可以了。或者取NSNumber 的intValue,在用>、=、<进行比较,第一个方法中有些两种方式的语句,后来的类似就不写了。

1、快速排序

#pragma - mark 快速排序
+ (void)quickSort:(NSMutableArray *)array low:(int)low high:(int)high
{
if(array == nil || array.count == 0){
return;
}
if (low >= high) {
return;
} //取中值
int middle = low + (high - low)/2;
NSNumber *prmt = array[middle];
int i = low;
int j = high; //开始排序,使得left<prmt 同时right>prmt
while (i <= j) {
// while ([array[i] compare:prmt] == NSOrderedAscending) { 该行与下一行作用相同
while ([array[i] intValue] < [prmt intValue]) {
i++;
}
// while ([array[j] compare:prmt] == NSOrderedDescending) { 该行与下一行作用相同
while ([array[j] intValue] > [prmt intValue]) {
j--;
} if(i <= j){
[array exchangeObjectAtIndex:i withObjectAtIndex:j];
i++;
j--;
} printf("排序中:");
[self printArray:array];
} if (low < j) {
[self quickSort:array low:low high:j];
}
if (high > i) {
[self quickSort:array low:i high:high];
}
}

快速排序的过程如下:

排序前:9 2 10 7 3 7 4
排序中:4 2 10 7 3 7 9
排序中:4 2 7 7 3 10 9
排序中:4 2 7 3 7 10 9
排序中:2 4 7 3 7 10 9
排序中:2 4 3 7 7 10 9
排序中:2 3 4 7 7 10 9
排序中:2 3 4 7 7 9 10
排序中:2 3 4 7 7 9 10
排序后:2 3 4 7 7 9 10

2、冒泡排序

#pragma - mark 冒泡排序
+ (void)buddleSort:(NSMutableArray *)array
{
if(array == nil || array.count == 0){
return;
} for (int i = 1; i < array.count; i++) {
for (int j = 0; j < array.count - i; j++) {
if ([array[j] compare:array[j+1]] == NSOrderedDescending) {
[array exchangeObjectAtIndex:j withObjectAtIndex:j+1];
} printf("排序中:");
[self printArray:array];
}
} }

冒泡排序的过程如下:

排序前:9 2 10 7 3 7 4
排序中:2 9 10 7 3 7 4
排序中:2 9 10 7 3 7 4
排序中:2 9 7 10 3 7 4
排序中:2 9 7 3 10 7 4
排序中:2 9 7 3 7 10 4
排序中:2 9 7 3 7 4 10
排序中:2 9 7 3 7 4 10
排序中:2 7 9 3 7 4 10
排序中:2 7 3 9 7 4 10
排序中:2 7 3 7 9 4 10
排序中:2 7 3 7 4 9 10
排序中:2 7 3 7 4 9 10
排序中:2 3 7 7 4 9 10
排序中:2 3 7 7 4 9 10
排序中:2 3 7 4 7 9 10
排序中:2 3 7 4 7 9 10
排序中:2 3 7 4 7 9 10
排序中:2 3 4 7 7 9 10
排序中:2 3 4 7 7 9 10
排序中:2 3 4 7 7 9 10
排序中:2 3 4 7 7 9 10
排序后:2 3 4 7 7 9 10

3、选择排序

+ (void)selectSort:(NSMutableArray *)array
{
if(array == nil || array.count == 0){
return;
} int min_index;
for (int i = 0; i < array.count; i++) {
min_index = i;
for (int j = i + 1; j<array.count; j++) {
if ([array[j] compare:array[min_index]] == NSOrderedAscending) {
[array exchangeObjectAtIndex:j withObjectAtIndex:min_index];
} printf("排序中:");
[self printArray:array];
}
}
}

选择排序的过程如下:

排序前:9 2 10 7 3 7 4
排序中:2 9 10 7 3 7 4
排序中:2 9 10 7 3 7 4
排序中:2 9 10 7 3 7 4
排序中:2 9 10 7 3 7 4
排序中:2 9 10 7 3 7 4
排序中:2 9 10 7 3 7 4
排序中:2 9 10 7 3 7 4
排序中:2 7 10 9 3 7 4
排序中:2 3 10 9 7 7 4
排序中:2 3 10 9 7 7 4
排序中:2 3 10 9 7 7 4
排序中:2 3 9 10 7 7 4
排序中:2 3 7 10 9 7 4
排序中:2 3 7 10 9 7 4
排序中:2 3 4 10 9 7 7
排序中:2 3 4 9 10 7 7
排序中:2 3 4 7 10 9 7
排序中:2 3 4 7 10 9 7
排序中:2 3 4 7 9 10 7
排序中:2 3 4 7 7 10 9
排序中:2 3 4 7 7 9 10
排序后:2 3 4 7 7 9 10

4、插入排序

#pragma - mark 插入排序
+ (void)inserSort:(NSMutableArray *)array
{
if(array == nil || array.count == 0){
return;
} for (int i = 0; i < array.count; i++) {
NSNumber *temp = array[i];
int j = i-1; while (j >= 0 && [array[j] compare:temp] == NSOrderedDescending) {
[array replaceObjectAtIndex:j+1 withObject:array[j]];
j--; printf("排序中:");
[self printArray:array];
} [array replaceObjectAtIndex:j+1 withObject:temp];
}
}

插入排序的过程如下:

排序前:9 2 10 7 3 7 4
排序中:9 9 10 7 3 7 4
排序中:2 9 10 10 3 7 4
排序中:2 9 9 10 3 7 4
排序中:2 7 9 10 10 7 4
排序中:2 7 9 9 10 7 4
排序中:2 7 7 9 10 7 4
排序中:2 3 7 9 10 10 4
排序中:2 3 7 9 9 10 4
排序中:2 3 7 7 9 10 10
排序中:2 3 7 7 9 9 10
排序中:2 3 7 7 7 9 10
排序中:2 3 7 7 7 9 10
排序后:2 3 4 7 7 9 10

另外,类的代码也附上吧!

//
// SortUtil.h
// SortUtil
//
// Created by Mac on 14-4-17.
// Copyright (c) 2014年 KnightKing. All rights reserved.
// #import <Foundation/Foundation.h> @interface SortUtil : NSObject //快速排序
+ (void)quickSort:(NSMutableArray *)array low:(int)low high:(int)high; //冒泡排序
+ (void)buddleSort:(NSMutableArray *)array; //选择排序
+ (void)selectSort:(NSMutableArray *)array; //插入排序
+ (void)inserSort:(NSMutableArray *)array; //打印数组
+ (void)printArray:(NSArray *)array; @end
//
// SortUtil.m
// SortUtil
//
// Created by Mac on 14-4-17.
// Copyright (c) 2014年 KnightKing. All rights reserved.
// #import "SortUtil.h" @implementation SortUtil #pragma - mark 快速排序
+ (void)quickSort:(NSMutableArray *)array low:(int)low high:(int)high
{
if(array == nil || array.count == 0){
return;
}
if (low >= high) {
return;
} //取中值
int middle = low + (high - low)/2;
NSNumber *prmt = array[middle];
int i = low;
int j = high; //开始排序,使得left<prmt 同时right>prmt
while (i <= j) {
// while ([array[i] compare:prmt] == NSOrderedAscending) { 该行与下一行作用相同
while ([array[i] intValue] < [prmt intValue]) {
i++;
}
// while ([array[j] compare:prmt] == NSOrderedDescending) { 该行与下一行作用相同
while ([array[j] intValue] > [prmt intValue]) {
j--;
} if(i <= j){
[array exchangeObjectAtIndex:i withObjectAtIndex:j];
i++;
j--;
} printf("排序中:");
[self printArray:array];
} if (low < j) {
[self quickSort:array low:low high:j];
}
if (high > i) {
[self quickSort:array low:i high:high];
}
} #pragma - mark 冒泡排序
+ (void)buddleSort:(NSMutableArray *)array
{
if(array == nil || array.count == 0){
return;
} for (int i = 1; i < array.count; i++) {
for (int j = 0; j < array.count - i; j++) {
if ([array[j] compare:array[j+1]] == NSOrderedDescending) {
[array exchangeObjectAtIndex:j withObjectAtIndex:j+1];
} printf("排序中:");
[self printArray:array];
}
} } #pragma - mark 选择排序
+ (void)selectSort:(NSMutableArray *)array
{
if(array == nil || array.count == 0){
return;
} int min_index;
for (int i = 0; i < array.count; i++) {
min_index = i;
for (int j = i + 1; j<array.count; j++) {
if ([array[j] compare:array[min_index]] == NSOrderedAscending) {
[array exchangeObjectAtIndex:j withObjectAtIndex:min_index];
} printf("排序中:");
[self printArray:array];
}
}
} #pragma - mark 插入排序
+ (void)inserSort:(NSMutableArray *)array
{
if(array == nil || array.count == 0){
return;
} for (int i = 0; i < array.count; i++) {
NSNumber *temp = array[i];
int j = i-1; while (j >= 0 && [array[j] compare:temp] == NSOrderedDescending) {
[array replaceObjectAtIndex:j+1 withObject:array[j]];
j--; printf("排序中:");
[self printArray:array];
} [array replaceObjectAtIndex:j+1 withObject:temp];
}
} + (void)printArray:(NSArray *)array
{
for(NSNumber *number in array) {
printf("%d ",[number intValue]);
} printf("\n");
} @end

调用我就写在了app启动的方法里:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible]; NSMutableArray *array = [NSMutableArray arrayWithObjects:@9,@2,@10,@7,@3,@7,@4,nil]; printf("排序前:");
[SortUtil printArray:array];
//快速排序
// [SortUtil quickSort:array low:0 high:6];
//冒泡排序
// [SortUtil buddleSort:array];
//选择排序
// [SortUtil selectSort:array];
//插入排序
[SortUtil inserSort:array]; printf("排序后:");
[SortUtil printArray:array]; return YES;
}

Objective-C实现常用的4种排序算法的更多相关文章

  1. java算法03 - 常用的8种排序算法

    Java常用的八种排序算法: 插入排序 - 直接插入排序 每次将待排序的记录按照关键字的大小,插入到前面已经排好序的记录的适当位置.直到全部记录插入完成. 代码实现 /** * 直接插入排序 O(n^ ...

  2. 学习Java绝对要懂的,Java编程中最常用的几种排序算法!

    今天给大家分享一下Java中几种常见的排序算法的Java代码 推荐一下我的Java学习羊君前616,中959,最后444.把数字串联起来!     ,群里有免费的学习视频和项目给大家练手.大神有空时也 ...

  3. 算法分析中最常用的几种排序算法(插入排序、希尔排序、冒泡排序、选择排序、快速排序,归并排序)C 语言版

    每次开始动手写算法,都是先把插入排序,冒泡排序写一遍,十次有九次是重复的,所以这次下定决心,将所有常规的排序算法写了一遍,以便日后熟悉. 以下代码总用一个main函数和一个自定义的CommonFunc ...

  4. Java中常用的6种排序算法详细分解

    排序算法很多地方都会用到,近期又重新看了一遍算法,并自己简单地实现了一遍,特此记录下来,为以后复习留点材料. 废话不多说,下面逐一看看经典的排序算法: 1. 选择排序 选择排序的基本思想是遍历数组的过 ...

  5. Java常用的八种排序算法与代码实现

    1.直接插入排序 经常碰到这样一类排序问题:把新的数据插入到已经排好的数据列中. 将第一个数和第二个数排序,然后构成一个有序序列 将第三个数插入进去,构成一个新的有序序列. 对第四个数.第五个数--直 ...

  6. 一遍记住Java常用的八种排序算法与代码实现

    1.直接插入排序 经常碰到这样一类排序问题:把新的数据插入到已经排好的数据列中. 将第一个数和第二个数排序,然后构成一个有序序列 将第三个数插入进去,构成一个新的有序序列. 对第四个数.第五个数……直 ...

  7. Java基础学习总结(60)——Java常用的八种排序算法

    1.直接插入排序 经常碰到这样一类排序问题:把新的数据插入到已经排好的数据列中. 将第一个数和第二个数排序,然后构成一个有序序列 将第三个数插入进去,构成一个新的有序序列. 对第四个数.第五个数--直 ...

  8. 一遍记住Java常用的八种排序算法

    1.直接插入排序 经常碰到这样一类排序问题:把新的数据插入到已经排好的数据列中. 将第一个数和第二个数排序,然后构成一个有序序列 将第三个数插入进去,构成一个新的有序序列. 对第四个数.第五个数--直 ...

  9. C#常用8种排序算法实现以及原理简介

    public static class SortExtention { #region 冒泡排序 /* * 已知一组无序数据a[1].a[2].--a[n],需将其按升序排列.首先比较a[1]与a[2 ...

随机推荐

  1. 实现鼠标双击(OnGUI)

    void OnGUI()//实现鼠标双击 { Event Mouse = Event.current; if (Mouse.isMouse && Mouse.type == Event ...

  2. URI与URL

    为了区分URI与URL,我们要引入URN URI = Universal Resource Identifier 统一资源标志符URL = Universal Resource Locator 统一资 ...

  3. flask jQuery ajax 上传文件

    1.html 代码 <div> <form id="uploadForm" enctype="multipart/form-data" > ...

  4. javascript requestAnimationFarme

    今天看到一篇很好的文章推荐一下:原文地址:http://www.zhangxinxu.com/wordpress/?p=3695 CSS3动画那么强,requestAnimationFrame还有毛线 ...

  5. hive升级遇到的几个小问题

    1.hiveserver2正常启动,但是beeline连不上服务. 我的服务是开在本机的,但是用主机名和127好像都不能访问服务了 jdbc:hive2://172.19.1.11:10000> ...

  6. ctf writeup之程序员密码

    起因 在v2ex上看到有人发了一篇帖子,说做了一个程序员小游戏,遂试玩了一下. 游戏的地址在这里: http://www.bettertomissthantomeet.com/pages/level. ...

  7. Go 语言递归函数

    递归,就是在运行的过程中调用自己. 语法格式如下: func recursion() { recursion() /* 函数调用自身 */ } func main() { recursion() } ...

  8. SLAMCN资料收藏转载

    网页链接地址:http://www.slamcn.org/index.php/%E9%A6%96%E9%A1%B5 资料非常丰富,内容如下: 首页 目录 [隐藏]  1 SLAM 介绍 1.1 什么是 ...

  9. 递归的神奇之处在于你会发现问题竟然解决了--解N皇后谜题有感

    看sicp看到8皇后谜题, 突然兴致来了,尝试独立解决(scheme代码的好处在于,即使你瞟了眼答案, 也不会有任何收获, 除了知道那儿有一坨神秘的括号和英文字符外但Python代码就不同了),成功了 ...

  10. vbs注册表增删改

    vbs注册表增删改非常简单.过去竟然能忍受那么多次手动在注册表编辑器操作...应该认真反思自己的懒惰了. Dim op Set op=WScript.CreateObject("WScrip ...