冒泡排序(OC实现)

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素已经排序完成。
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

算法原理

冒泡排序算法的原理如下:

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。

  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

  3. 针对所有的元素重复以上的步骤,除了最后一个。

  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 [1]

冒泡排序流程图


屏幕快照 2019-01-31 上午10.15.06.png

举个
拿到一个数组

NSMutableArray *result = [NSMutableArray arrayWithObjects:@3,@1,@4,@2,@5,nil]; 

执行过程说明:
数组中一共有5个元素,我们拿第一个数字去和第二个数字比较,如果第一个数字比第二个数字大的话,那么第一个数字和第二个数字交换位置,如果相等的话 保持位置不变,如果第一个数小于第二个数字,那么保持当前位置不做交换。然后用第一个数字和第三个数字比较,以此类推,直到,第一个数字与几个中所有元素比较完毕,那么就可以确定第一个数字的位置了。

那么由于数组中一共有五个元素,所以我们需要分别用这5个数字去执行上述的步骤,也就是说需要循环5次。但是由于后面的元素越来越少(因为前面的元素已经比较过了,一共只有5个,所以越来越少,持续每次对越来越少的元素(无序元素)重复上面的步骤,直到没有任何一对数字需要比较,则序列最终有序。

了解完执行过程,那么代码很容易就可以理解了
错误代码,这样有很多重复的操作

这样做也能起到排列的作用,但是有很多重复的操作。
 NSMutableArray *result = [NSMutableArray arrayWithObjects:@3,@1,@4,@2,@5,nil];
    for (int i = 0; iright) {
                [result exchangeObjectAtIndex:i withObjectAtIndex:i+1];
            }
    }
    NSLog(@"%@",result);

正确的代码(使用内层循环避免重复操作)
//内层循环为当前i趟数,所需要比较的元素个数(举例如果当前需要比较的元素下标位置为2,那么这个数字为4,为什么数字为4呢?因为当i=0的时候,执行一次排序后数组的排列变为@1,@2,@4,@3,@5)所以第下标为2的数字为4,那么这时候,拿4去和下标为3的元素2,以及下标为4的数字5比较,所以内层循环的次数应该为result.count-1-i(内层循环的目的是为了避免去比较已经比较循环过的数字,提升效率)

NSMutableArray *result = [NSMutableArray arrayWithObjects:@3,@1,@4,@2,@5,nil];
    for (int i = 0; iright) {
                [result exchangeObjectAtIndex:j withObjectAtIndex:j+1];
            }
        }
    }
    NSLog(@"%@",result);

你可能感兴趣的:(冒泡排序(OC实现))