冒泡排序
来源:互联网 发布:vmware linux nat模式 编辑:程序博客网 时间:2024/06/03 13:44
序言
本篇一起来学习冒泡排序的算法,它可是面试中经常会问到的哦,而且挺常使用的。今天跟大家一起来回忆回忆大学那些年所学过的冒泡排序算法。
本篇将会使用C语言、ObjC和Swift分别来实现冒泡排序,并通过ObjC来举一个模型类冒泡排序的小例子,希望对大家在开发中应用算法有所帮助。
冒泡排序核心思想
算法最讲究的就是算法的思想,只要将算法思想想明白了,就可以通过伪代码来写出算法,那么再使用对应的语言来实现就可以了。
冒泡排序的核心思想就是通过与相邻元素的比较和交换,把小的数交换到最前面。因为这个过程类似于水泡向上升一样,因此被命名为冒泡排序。
举个小例子:对5,3,8,6,4这个无序序列进行冒泡排序。
首先从后向前冒泡,4和6比较,把4交换到前面,序列变成5,3,8,4,6。同理4和8交换,变成5,3,4,8,6,3和4无需交换。5和3交换,变成3,5,4,8,6.这样一次冒泡就完了,把最小的数3排到最前面了。对剩下的序列依次冒泡就会得到一个有序序列。
其过程大概是这样的:
第一趟:
<span style="font-size:18px;">5,3,8,6,4(开始)5,3,8,4,6(6和4交换)5,3,4,8,6(8和4交换)5,3,4,8,6(3和4不用交换)3,5,4,8,6(5和3交换)</span>
第二趟:
<span style="font-size:18px;">3,5,4,6,8(8和6交换)3,5,4,6,8(4和6不用交换)3,4,5,6,8(5和4交换)3,4,5,6,8(3和4不用交换)</span>
这里只需要两趟就可以排序完成了。
时间复杂度
从算法思想可知,冒泡排序需要两个循环来控制遍历,也就是需要n * n趟才能判断、交换完成。
冒泡排序的时间复杂度为O ( n2 )。
伪代码
<span style="font-size:18px;">voidbubbleSort(inta[],intlen){ fori=0;i<len-1;++i{ forj=len-1;j>i;--j{ ifa[j]<a[j-1]{ swap(a,j,j-1); } } }} voidswap(inta[],inti,intj){ inttemp=a[i]; a[i]=a[j]; a[j]=temp;}</span>
C语言版
<span style="font-size:18px;">voidbubbleSortUsingC(intarr[],intlen){ // 代表走多少趟,最后一趟就不用再走了 for(inti=0;i<len-1;++i){ // 从后往前走,相当于泡从水底冒出来到水面 for(intj=len-1;j>i;--j){ // 如果后面的比前面一个的值还要小,则需要交换 if(arr[j]<arr[j-1]){ swap(arr,j,j-1); } } }} voidswap(intarr[],inti,intj){ inttemp=arr[i]; arr[i]=arr[j]; arr[j]=temp;}</span>
测试一下:
<span style="font-size:18px;">inta[5]={5,3,8,6,4}; bubbleSortUsingC(a,sizeof(a)/sizeof(int)); for(inti=0;i<sizeof(a)/sizeof(int);++i){ NSLog(@"%d",a[i]);} // 打印: 3, 4, 5, 6, 8 初步如期效果</span>
ObjC版
<span style="font-size:18px;">-(void)bubbleSort:(int[])array len:(size_t)len{ for(size_ti=0;i<len-1;++i){ for(size_tj=len-1;j>i;--j){ if(array[j]<array[j-1]){ // 交换 inttemp=array[j]; array[j]=array[j-1]; array[j-1]=temp; } } }}</span>
测试使用:
<span style="font-size:18px;">inta[5]={5,3,8,6,4};[self bubbleSort:a len:sizeof(a)/sizeof(int)];for(inti=0;i<sizeof(a)/sizeof(int);++i){ NSLog(@"%d",a[i]);}</span>
Swift版
<span style="font-size:18px;"> funcbubbleSort(var arr:[Int])->[Int]{ // 走多少趟 forvari=0;i<arr.count-1;++i{ // 从后往前 forvarj=arr.count-1;j>i;--j{ // 后者 < 前者 ? 交换 : 不交换 ifarr[j]<arr[j-1]{ lettemp=arr[j] arr[j]=arr[j-1] arr[j-1]=temp } } } returnarr}</span>
测试使用:
<span style="font-size:18px;">// 由于swift中数组也是结构体,是值类型,因此需要接收返回值才能得到排序后的数组vararr=[5,3,8,6,4]arr=bubbleSort(arr)print(arr)</span>
尝试给Model排序
<span style="font-size:18px;">-(void)bubbleSort:(NSMutableArray*)array{ for(NSUIntegeri=0;i<array.count-1;++i){ for(NSUIntegerj=array.count-1;j>i;--j){ HYBTestModel*modelj=[array objectAtIndex:j]; HYBTestModel*modelj_1=[array objectAtIndex:j-1]; // 前者 < 后者 ? 交换 : 不交换 if([modelj.uid compare:modelj_1.uid options:NSCaseInsensitiveSearch]==NSOrderedAscending){ [array exchangeObjectAtIndex:j withObjectAtIndex:j-1]; } } }}</span>
测试:
<span style="font-size:18px;">NSMutableArray*array=[[NSMutableArrayalloc] init];for(NSUIntegeri=0;i<10;++i){ HYBTestModel*model=[[HYBTestModelalloc] init]; model.title=[NSString stringWithFormat:@"标哥的技术博客:%ld",10-(i+1)]; model.uid=[NSString stringWithFormat:@"%ld",10-(i+1)]; [array addObject:model];} [self bubbleSort:array]; for(HYBTestModel*modelinarray){ NSLog(@"%@ %@",model.uid,model.title);} // 打印:2016-03-1022:57:37.524DataAgorithmDemos[96148:3779265] 0标哥的技术博客:02016-03-1022:57:37.526DataAgorithmDemos[96148:3779265] 1标哥的技术博客:12016-03-1022:57:37.526DataAgorithmDemos[96148:3779265] 2标哥的技术博客:22016-03-1022:57:37.526DataAgorithmDemos[96148:3779265] 3标哥的技术博客:32016-03-1022:57:37.582DataAgorithmDemos[96148:3779265] 4标哥的技术博客:42016-03-1022:57:37.588DataAgorithmDemos[96148:3779265] 5标哥的技术博客:52016-03-1022:57:37.589DataAgorithmDemos[96148:3779265] 6标哥的技术博客:62016-03-1022:57:37.593DataAgorithmDemos[96148:3779265] 7标哥的技术博客:72016-03-1022:57:37.594DataAgorithmDemos[96148:3779265] 8标哥的技术博客:82016-03-1022:57:37.596DataAgorithmDemos[96148:3779265] 9标哥的技术博客:9</span>
说明排序正常的~
(转自标哥的技术博客)
0 0
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 冒泡排序
- 最长回文子串
- Codeforces 584A Olesya and Rodion 【构造】
- 开源日志系统比较:scribe、chukwa、kafka、flume
- 【杭电】[2099]整除的尾数
- 伪主动触发input:file的click事件
- 冒泡排序
- android开发--volley的使用
- POJ2253 Frogger
- 手机内存、sdcard读写操作学习笔记
- Myclipse发布项目错误问题已解决
- 运行时执行过程
- Ubuntu下配置Swift编程环境
- plsql访问oracle数据库中文乱码问题解决方法
- HDU 1711