C-025.数组的冒泡排序,升序排列

冒泡排序的思路

比如有一个数组 array[5] = {1,3,2,4,0};

第一趟比较

第一次比较后得到:1,3,2,4,0(0下标和1下标比较)

第二次比较后得到:1,2,3,4,0(1下标和2下标比较)

第三次比较后得到:1,2,3,4,0(2下标和3下标比较)

第四次比较后得到:1,2,3,0,4(3下标和4下标比较) 这时候已经可以确定最后的数字为最大,所以下一趟比较只需要比较前4个数字

第二趟比较

第一次比较后得到:1,2,3,0,4(0下标和1下标比较)

第二次比较后得到:1,2,3,0,4(1下标和2下标比较)

第三次比较后得到:1,2,0,3,4(2下标和3下标比较)确定倒数第二大得数字,下一趟只需要比较前面3个数字

第三趟比较

第一次比较后得到:1,2,0,3,4(0下标和1下标比较)

第二次比较后得到:1,0,2,3,4(1下标和2下标比较)确定倒数第3位大得数字,下一趟只需要比较前面2个数字

第四趟比较

第一次比较后得到:0,1,2,3,4(0下标和1下标比较)排序完成


总结:

以n个元素的数组为例:元素个数为n ,外层循环为 = n - 1 次,每一次内层比较次数 = n - 第几次外层循环(有点晕)


void printArray(int array[],int length){  //打印数组的函数
    printf("[");
    for (int i = 0; i < length; i++) {
        printf("%d",array[i]);
        if (i != length - 1) {
            printf(",");
        }
    }
    printf("]\n");
}

void sortArray(int array[],int length){   //排序函数
    
    //  冒泡排序规则:两两比较大的下沉小的上浮
    //  外层循环控制一共比较几次
    for (int i = 0; i < length ; i++) {
        //内循环两两比较,小的上浮,大得下沉
        for (int j = 0; j < length - 1 - i; j++) {
            //如果前面大于后面,交换位置
            if (array[j] > array[j + 1]) {
                int temp = array[j];
                array[j] = array[j + 1];
                array[j + 1] = temp;
            }
        }
    }
}

int main(int argc, const char * argv[]) {
    int array[] = {1,3,7,4,2,5,10,25,24,31};
    int length = sizeof(array) / sizeof(int);
    printArray(array, length); //输出排序之前数组
    sortArray(array, length);  //排序
    printArray(array, length); //输出排序之后数组

    return 0;
}

同样是排序,OC中就比较方便,因为系统中已经有了排序的方法:

方法有3:1.通过选择器:@se'lector

                 2.通过比较器:block封装代码

                 3.通过属性描述器:NSSortDescriptor属性描述


这里只介绍第一种选择器,后面的在OC中介绍:

int main(int argc, const char * argv[]) {
    @autoreleasepool {
       
        NSArray *array = @[@8,@6,@10,@2,@1];//创建一个数组对象,基本数据类型通过@包装
        NSLog(@"前:%@",array);//打印array数组
        array = [array sortedArrayUsingSelector:@selector(compare:)];//通过比较器对象方法排序,可以重写比较方法来进行想要的排序
        NSLog(@"后:%@",array);//打印排序后的数组
    
    }
    return 0;
}








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值