前言:排序是现在程序员的必备技能,是很多公司的面试必考点,不管是做移动端,后端开发,排序是绕不过的,众生平等。学习其排序的思想往往能解决不同类型的问题,所以静下心来,研究一下不同的排序算法,算是对自己有一个提升。
排序概述:排序就是将一组对象按照某种逻辑顺序重新排列的过程。
十大排序算法:冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序,希尔排序,计数排序,基数排序,桶排序。
本文对冒泡排序走一个解析:
冒泡排序:其实这是一种很简单的排序算法,它反复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。这个工作重复地进行直到没有元素再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为元素会经由交换慢慢“浮”到数列的顶端。
冒泡排序工作步骤:
1.从数组头开始,比较相邻的元素,如果第一个比第二个大或者小,就进行交换工作。
2.对每一对相邻元素作同样的工作,从开始第一到尾部的最后一对,这样在最后的元素会是最大或者是最小的数。
3.一直重复步骤1和2,重复次数等于数组的长度,一直到排序彻底完成方可结束。
代码举例:
对一个数组进行排序:(86,11,77,23,32,45,58,63,93,4,37,22)
int[] array = {86,11,77,23,32,45,58,63,93,4,37,22};
排序代码展示:
调用sort方法后打印如下:
对该案例进行分析:
(1).i==0 时,进行第一次内部循环
1: 86 > 11 在if里面86 和 11交换了位置 数组==>(11,86,77,23,32,45,58,63,93,4,37,22) 内部循环第一次 j == 0
2: 86 > 77 在if里面86 和 11交换了位置 数组==>(11,77,86,23,32,45,58,63,93,4,37,22) 内部循环第二次 j == 1
...... 一直重复这个步骤,内层循环结束第一次 (11,77,23,32,45,58,63,86,4,37,22,93)
(2).i==1 时,进行第二次内部循环
1: 11 < 77 跳出if语句 数组==>(11,77,23,32,45,58,63,86,4,37,22,93) 内部循环第一次 j == 0
2: 77 < 86 跳出if语句 数组==>(11,77,86,23,32,45,58,63,93,4,37,22) 内部循环第二次 j == 1
...... 一直重复这个步骤,内层循环结束第二次 (11,77,23,32,45,58,63,86,4,37,86,93)
一直重复这个过程:直至外层完成,排序就完成了,看一下打印过程:
注意:在内层循环里有一个 j < array.length - 1 - I; 是因为每次排序一个完成,就减掉一个,减少每一次循环的次数,提高排序效率。
至此冒泡排序就到这里讲解结束了,细看的话其实一点也不复杂。