算法解析冒泡排序 Bubble Sort
Posted AoHas
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法解析冒泡排序 Bubble Sort相关的知识,希望对你有一定的参考价值。
近期在阅读算法的一些书籍,对基础算法整理并分享些学习心得。这篇介绍冒泡排序。欢迎留言交流
维基百科对冒泡排序解释:是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
实现:简单来说,就是比较相邻的两个数字,将最大的数往后移,只到最后一位为止。如下图
可以看到数组最后一位数字变成了9。继续比较数字9前面的数据。
代码:
int bubbleSort[9] = {4,6,3,9,7,8,5,1,2}; int count = 9; for (int i=0; i<count; i++) { //要遍历的个数 for (int j=1; j<(count - i); j++) { //遍历数组并找到最大那个数,并将其移到最后一位 int left =bubbleSort[j - 1];//当前坐标位置前一个值 int right = bubbleSort[j]; ////当前坐标位置的值 if (left > right) { bubbleSort[j] = left; bubbleSort[j-1] = right; } } } |
对代码的优化:
//优化1,如果执行遍历数组并找到最大那个数时,发现没有数据可交换,说明此数组已按照从小到大的顺序排列好。
int bubbleSort[9] = {1,2,3,4,5,6,7,8,9}; int count = 9; bool bBreak = false; //开关,用于判断相邻位置上是否有数据交换 for (int i=0; i<count; i++) { //要遍历的个数 bBreak = true; for (int j=1; j<(count - i); j++) { //找到数组中最大个那个数,并将其移到最后一位 int left =bubbleSort[j - 1];//当前坐标位置前一个值 int right = bubbleSort[j]; ////当前坐标位置的值 if (left > right) { bubbleSort[j] = left; bubbleSort[j-1] = right; bBreak = false; } } if (bBreak) { break; } } |
//优化2,如果比较完相邻位置上的数据后,发现这个位置之后的数据没有发生交换,显然已经有序
int bubbleSort[9] = {3,2,1,4,5,6,7,8,9};// int count = 9; bool bBreak = false; //开关,用于判断相邻位置上是否有数据交换 for (int loopCount=0; loopCount<count; loopCount++) { //要遍历的个数 bBreak = true; int sortIndex = 0; //注意:这个是数组坐标,最大值是count-1. 记录某次遍历时最后发生数据交换的位置 for (int j=1; j< (count-loopCount); j++) { //找到数组中最大个那个数,并将其移到最后一位 int left =bubbleSort[j - 1];//当前坐标位置前一个值 int right = bubbleSort[j]; ////当前坐标位置的值 if (left > right) { bubbleSort[j] = left; bubbleSort[j-1] = right; bBreak = false; sortIndex = j; } } //两个作用:1.判断当前位置之后的数据是否已经有序。2.如果当前位置之后的数据显然已经有序,重新建立比较过程。 if (sortIndex < (count-loopCount-1)) { count = sortIndex+1; } if (bBreak) { break; } } |
以上是关于算法解析冒泡排序 Bubble Sort的主要内容,如果未能解决你的问题,请参考以下文章