- 冒泡排序
原理:比较两个相邻的元素,将值大的元素交换到右边
思路:(1)由此可见:N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-i)次,所以可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数
(2)冒泡排序的优点:每进行一趟排序,就会少比较一次,因为每进行一趟排序都会找出一个较大值。如上例:第一趟比较之后,排在最后的一个数一定是最大的一个数,第二趟排序的时候,只需要比较除了最后一个数以外的其他的数,同样也能找出一个最大的数排在参与第二趟比较的数后面,第三趟比较的时候,只需要比较除了最后两个数以外的其他的数,以此类推……也就是说,没进行一趟比较,每一趟少比较一次,一定程度上减少了算法的量
-
优化:利用布尔值,如果一趟过后不需要交换,跳出循环
for(int i = 0 ;i<arr.length-1;i++){ //第i趟比较 for(int j = 0 ;j<arr.length-i-1;j++){ //开始进行比较,如果arr[j]比arr[j+1]的值大,那就交换位置 if(arr[j]>arr[j+1]){ int temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } }
- 选择排序
原理:从头至尾扫描序列,找出最小的一个元素,和第一个元素交换,接着从剩下的元素中继续这种选择和交换方式,最终得到一个有序序列
-
关键变量:minIndex 、min
public static void selectSort(int [] arr){ for (int i = 0; i < arr.length - 1; i++) { int minIndex = i; int min=arr[i]; // 找出最小值得元素下标 for (j = i + 1; j < arr.length; j++) { if (min > arr[j]) { minIndex = j; min = arr[j]; } } if(minIndex != i){ arr[minIndex]=arr[i]; arr[i] = min; } } }