最基础的各类排序算法和汉罗塔的代码展示

以下代码带有文字说明,各位可以直接复制使用,进行结果展示,这里推荐图文介绍算法的文章:http://www.jianshu.com/p/70619984fbc6

第二篇(Swift版)http://www.cocoachina.com/ios/20170105/18522.html

- (void)viewDidLoad {

    [super viewDidLoad];
    //NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:@"20",@"6",@"2",@"8",@"9",@"12",@"2",@"4",@"3",@"4",@"7",@"11", nil];
    int array[12] = {20,6,2,8,9,12,2,4,3,4,7,11};
    
    /*
    //冒泡排序:将已排序部分定义在右端,在遍历未排序部分的过程执行交换,将最大元素交换到最右端。相邻两个比较,大的放后面。时间复杂度,平均情况:O(n^2),最好情况:O(n)

/** * 【冒泡排序】:相邻元素两两比较,比较完一趟,最值出现在末尾 * 第1趟:依次比较相邻的两个数,不断交换(小数放前,大数放后)逐个推进,最值最后出现在第n个元素位置 * 第2趟:依次比较相邻的两个数,不断交换(小数放前,大数放后)逐个推进,最值最后出现在第n-1个元素位置 * …… …… * 第n-1趟:依次比较相邻的两个数,不断交换(小数放前,大数放后)逐个推进,最值最后出现在第2个元素位置 */

    BOOL exchanged = YES;
    for (int i = 0; i < 11 && exchanged; i ++)
    {
        exchanged = NO;
        for (int j = 0; j < 11 - i; j ++)
        {
            int aj = array[j];
            int aj1 = array[j + 1];
            if (aj > aj1)
            {
                exchanged = YES;
                array[j + 1] = aj;
                array[j] = aj1;
            }
        }
    }
     */
    /*
    //选择排序:将已排序部分定义在左端,然后选择未排序部分的最小元素和未排序部分的第一个元素交换。选择每一轮的小的放在前面,排好序的不比较。时间复杂度,平均情况:O(n^2),最好情况:O(n^2)。

/** * 【选择排序】:最值出现在起始端 * * 第1趟:在n个数中找到最小(大)数与第一个数交换位置 * 第2趟:在剩下n-1个数中找到最小(大)数与第二个数交换位置 * 重复这样的操作...依次与第三个、第四个...数交换位置 * 第n-1趟,最终可实现数据的升序(降序)排列。 * */

    for (int i = 0; i < 12; i ++)
    {
        for (int j = i + 1; j < 12; j ++)
        {
            int ai = array[i];
            int aj = array[j];
            if (ai > aj)
            {
                array[i] = aj;
                array[j] = ai;
            }
        }
    }
     */
    
    /*
    //插入排序:将已排序部分定义在左端,将未排序部分元的第一个元素插入到已排序部分合适的位置。将一个值拿出,空出一个位置,与前面的所有的值比较,比其大的后移一位,直到没有比其小的停止,并把值插入到空位处。时间复杂度,平均情况:O(n^2),最好情况:O(n)。
    for (int i = 1; i < 12; i ++)
    {
        int ai = array[i],aj;
        int j = i;
        while (j > 0 && (aj = array[j - 1]) > ai)
        {
            array[j] = aj;
            j --;
        }
        array[j] = ai;
    }
     */
    
    //快速排序:首先任意选取一个数据(通常选数组的第一个数)作为关键数据,然后将所有比他小的数据都放在她得前面,所有比他大的数都放到它的后面,与一个数的比较,有时候会前后两个方向进行,这个过程成为一趟快速排序
    //C语言调用方法
    quick(array,0,11);
    
    //排序后输出
    for (int n = 0; n < 12; n ++)
    {
        NSLog(@"%d",array[n]);
    }
    
}
void quick(int a[],int left, int right)
{
    if (left < right)//如果左边索引小于右边的索引就代表已经整理完成一个组了
    {
        int key = a[ left ];
        int low = left;
        int hight = right;
        while ( low < hight)//控制在当前组内寻找一遍
        {
            while( low < hight && a[hight] >= key)//而寻找结束的条件就是:1.找到一个小于或者大于key的数(大于或小于取决于你想升序还是降序)2.没有符合条件 1 的,并且 low 与 hight 的大小没有翻转
            {
                hight --;//向前寻找
            }
            a[ low ] = a [ hight ];
            //找到一个这样的数后就把它赋给前面的被拿走的low的值(如果第一次循环且key是a[left],那么就是给key)
            while( low < hight && a[ low ] <= key)//这是low在当前组内向前寻找,同上,不过注意与key的大小关系停止循环和上面襄樊,因为排序思想是把数往两边放,所以左右两边的数大小与key的关系相反
            {
                low ++;//向后寻找
            }
            a[ hight ] = a[ low ];
        }
        a[ low ] = key;//当在当前组内找完一遍以后就把中间数key回归
        quick( a, left ,low - 1);//最后用同样的方式对分出来的左边的小组进行同上的做法
        quick( a, low + 1, right);//用同样的方式对分出来的右边的小组进行同上的做法,当然最后可能会出现很多次分左右,直到每一组的low = hight为止
    }
}

常用排序的时间复杂度:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hbblzjy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值