冒泡排序

序言

本篇一起来学习冒泡排序的算法,它可是面试中经常会问到的哦,而且挺常使用的。今天跟大家一起来回忆回忆大学那些年所学过的冒泡排序算法。

本篇将会使用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>


第二趟:

这里只需要两趟就可以排序完成了。

时间复杂度

从算法思想可知,冒泡排序需要两个循环来控制遍历,也就是需要n * n趟才能判断、交换完成。

冒泡排序的时间复杂度为O ( n2 )。

伪代码

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>


测试使用:

尝试给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标哥的技术博客:0
2016-03-1022:57:37.526DataAgorithmDemos[96148:3779265] 1标哥的技术博客:1
2016-03-1022:57:37.526DataAgorithmDemos[96148:3779265] 2标哥的技术博客:2
2016-03-1022:57:37.526DataAgorithmDemos[96148:3779265] 3标哥的技术博客:3
2016-03-1022:57:37.582DataAgorithmDemos[96148:3779265] 4标哥的技术博客:4
2016-03-1022:57:37.588DataAgorithmDemos[96148:3779265] 5标哥的技术博客:5
2016-03-1022:57:37.589DataAgorithmDemos[96148:3779265] 6标哥的技术博客:6
2016-03-1022:57:37.593DataAgorithmDemos[96148:3779265] 7标哥的技术博客:7
2016-03-1022:57:37.594DataAgorithmDemos[96148:3779265] 8标哥的技术博客:8
2016-03-1022:57:37.596DataAgorithmDemos[96148:3779265] 9标哥的技术博客:9</span>


说明排序正常的~

(转自标哥的技术博客)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值