递归冒泡排序的实现方法与优化
本篇博客将介绍递归冒泡排序的实现方法,通过对比传统冒泡排序和带有标记的优化版本了解递归冒泡排序的基本思想,学习如何使用递归算法进行排序,并了解如何通过引入标记来优化算法效率。
在b站学的递归方法写冒泡排序
public static void bubbleSort(int[]arr,int j){
//j在这里表示待排序数组的右边界
if(j==0){
return ;
}
//x记录的是最后一次交换后,待排序数组的右边界
int x=0;
for(int i=0;i<j;i++){
if(arr[i]>arr[i+1]){
int n=arr[i];
arr[i]=arr[i+1];
arr[i+1]=n;
}
x=i;
}
bubbleSort(arr,x);
}
基本思路:通过不断缩小待排序数组的范围完成递归、排序
两个要点:
1.j的意义:j记录的是待排序数组的右边界
2.x的意义:有序数组的左边界
假如有一个数组arr
int[]arr={6,3,5,4,2,1};
注意最后两个元素)
现在我们要对arr进行升序排序,那第一趟的最后一次交换是谁和谁交换?不管是谁和谁做交换,交换完之后它俩是不是有序?既然这是最后一次交换,那后边的数组就都是有序的,不然还要再进行交换,这次就不是最后一次了。
x的作用其实就是记录有序数组的左边界,在值上刚刚好等于待排序数组的元素个数——还剩几个待排序的元素。
这里可以对比一下最原始版的冒泡排序的写法和有标记的冒泡排序,看看其中的变量有什么关系。
public static void bubbleSort(int[]arr){
for (int j = 0; j < arr.length - 1; j++) {
for (int i = 0; i < arr.length - j - 1; i++) {
if (arr[i] > arr[i + 1]) {
int temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
}
}
差异:原始版的冒泡排序只是做遍历,而有标记的冒泡排序在内层循环中使用了一个变量 x,用来记录最后一次交换的位置。通过将最后一次交换位置 x 赋给外层循环的控制变量 j,可以减少不必要的比较和交换操作。
不用递归但是有标记的冒泡排序
public static void myBubbleSort(int[]arr){
for(int j=arr.length-1,x=0;j!=0;j=x){
for(int i=0;i<j;i++){
if(arr[i]>arr[i+1]){
int n=arr[i];
arr[i]=arr[i+1];
arr[i+1]=n;
}
x=i;
}
}
}
总结
其实用递归写冒泡排序一眼就看出来效率还不如原来的,但是现在是在学递归,学学就好了。
在学习递归版的冒泡排序的过程中,又运用了递归的知识,并且学到了标记这个概念