冒泡排序算法的原理如下:
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
思路:依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面。
(1)第一次比较:首先比较第1个和第2个数,将小数放在前面,将大数放在后面。
(2)比较第2和第3个数,将小数 放在前面,大数放在后面。
......
(3)如此继续,知道比较到最后的两个数,将小数放在前面,大数放在后面,重复步骤,直至全部排序完成
(4)在上面一趟比较完成后,最后一个数一定是数组中最大的一个数,所以在比较第二趟的时候,最后一个数是不参加比较的。
(5)在第二趟比较完成后,倒数第二个数也一定是数组中倒数第二大数,所以在第三趟的比较中,最后两个数是不参与比较的。
(6)依次类推,每一趟比较次数减少依次
要排序数组:[8,3,2,5,1,7]
第一趟排序:
第1次排序:8和3比较,8大于3,交换位置 [3,8,2,5,1,7]
第2次排序:8和2比较,8大于2,交换位置 [3,2,8,5,1,7]
第3次排序:8和5比较,8大于5,交换位置 [3,2,5,8,1,7]
第4次排序:8和1比较,8大于1,交换位置 [3,2,5,1,8,7]
第5次排序:8和7比较,8大于7,交换位置 [3,2,5,1,7,8]
第一趟总共进行了5次比较,排序结果:[3,2,5,1,7,8]
第二趟排序:
第1次排序:3和2比较,3大于2,交换位置 [2,3,5,1,7,8]
第2次排序:3和5比较,3小于5,不交换位置 [2,3,5,1,7,8]
第3次排序:5和1比较,5大于1,交换位置 [3,2,1,5,7,8]
第4次排序:5和7比较,5小于7,不交换位置 [3,2,1,5,7,8]
第二趟总共进行了4次比较,排序结果:[3,2,1,5,7,8]
void MainWindow::bubbleSort(int *data, int len) { int temp; for(int i=0;i<len-1;i++) { for(int j=0;j<len-1-i;j++) { if(data[j]>data[j+1]) { temp=data[j]; data[j]=data[j+1]; data[j+1]=temp; } } } }
int my_array[6]={8,3,2,5,1,7}; bubbleSort(my_array,6); for(int i=0;i<6;i++) { std::cout<<" "<<my_array[i]; } std::cout<<std::endl;
//输出 1 2 3 5 7 8
最近看到一篇动画演示的,介绍的也比较详细:
https://www.cnblogs.com/flydean/p/algorithm-bubble-sort.html
C#实现
int[] array = { 29, 10, 14, 37, 20, 25, 44, 15 }; BubbleSort(array); private void BubbleSort(int[] array) { Console.WriteLine("排序前的数组为:" + ArrayToString(array)); //外层循环,遍历所有轮数 for (int i = 0; i < array.Length - 1; i++) { //内层循环,两两比较,选中较大的数字,进行交换, 最后的i个数字已经排完序了,不需要再进行比较 for (int j = 0; j < array.Length - i - 1; j++) { if (array[j] > array[j + 1]) { //交换两个数字 int temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; } } Console.WriteLine("第"+i+"轮排序后的数组为:"+ArrayToString(array)); } } private string ArrayToString(int[] array) { string str = ""; for(int i=0;i<array.Length;i++) { str += array[i].ToString() + " "; } return str; }
排序前的数组为:29 10 14 37 20 25 44 15
第0轮排序后的数组为:10 14 29 20 25 37 15 44
第1轮排序后的数组为:10 14 20 25 29 15 37 44
第2轮排序后的数组为:10 14 20 25 15 29 37 44
第3轮排序后的数组为:10 14 20 15 25 29 37 44
第4轮排序后的数组为:10 14 15 20 25 29 37 44
第5轮排序后的数组为:10 14 15 20 25 29 37 44
第6轮排序后的数组为:10 14 15 20 25 29 37 44