Java代码实现交换排序:冒泡排序,快速排序(以及为什么不从左边开始)
代码实现
public class SwapSort{
//冒泡排序(升序)
public static void bubbleSort(int[] sorted){
int sortedLen = sorted.length;
//外层循环趟数
for(int i = 0;i < sortedLen - 1;i++){
//内层依次循环数据并与相邻的数据进行比较
for(int j = 0;j < sortedLen - 1 - i;j++){
//如果前面的数据大于后面的数据,进行交换
if(sorted[j] > sorted[j+1]){
int temp = sorted[j+1];
sorted[j+1] = sorted[j];
sorted[j] = temp;
}
}
}
}
//冒泡排序结束
//快速排序(升序)
public static void quickSort(int[] sorted,int left,int right){
if(i > j)
return;
//设置最左边的数据为基准数
int pivot = sorted[left];
//为左右哨兵各添加一个索引
int i = left,j = right;
//左右哨兵依次遍历,直到二者重合
while(i < j){
//从右边哨兵开始(文章下面附有为什么不从左边开始的讲解)
while(sorted[j] >= pivot && i < j){
j--;
}
//右边哨兵寻找到比基准数小的数据时停止,左边哨兵开始寻找比基准数大的数据
while(sorted[i] <= pivot && i < j){
i++;
}
//交换 左右哨兵找到的数据 的位置
int temp = sorted[i];
sorted[i] = sorted[j];
sorted[j] = temp;
}
//交换 基准数 和 左右哨兵重合的数据 的位置
sorted[j] = pivot;
sorted[left] = sorted[i];
//以基准数交换后的位置为中心,将左右两边的子数组,分别进行快速排序(重复以上操作)
quickSorted(sorted,left,j - 1);
quickSorted(sorted,j + 1,right);
}
//快速排序结束
public static void main(String[] args) {
int[] sort = new int[5];
sort[0] = 2;
sort[1] = 88;
sort[2] = 1;
sort[3] = 8;
sort[4] = 78;
System.out.println("Before Sort:");
System.out.println(Arrays.toString(sort));
SwapSort.quickSort(sort,0,sort.length);
System.out.println("After Sort:");
System.out.print(Arrays.toString(sort));
}
}
运行结果
关于快速排序为什么不从左边开始的解惑
while(sorted[j] >= pivot && i < j){
j--;
}
while(sorted[i] <= pivot && i < j){
i++;
}
这里两个while的顺序是不能改变的,想一想:
假设对如下进行排序:
如上图,6在左,9在右 我们将6作为基数。
假设从左边开始(与正确程序正好相反)
while(sorted[i] <= pivot && i < j){
i++;
}
while(sorted[j] >= pivot && i < j){
j--;
}
按照这个代码逻辑,走一遍,i 就会移动到现在的 数字 7 那个位置停下来,而 j 原来在 数字 9 那个位置
于是,j 也会停留在数字7 那个位置,然后 i == j了,这时候交换基准数和nums[i]
交换后的数组为:7 1 2 6 9
这时候,你会发现问题来了,这结果不对呀!!!
问题在于当我们先从在边开始时,那么 i 所停留的那个位置肯定是大于基数6的
而在上述例子中,为了满足 i<j 于是 j也停留在7的位置,但最后交换回去的时候,7就到了左边
不行,因为我们原本 交换后数字6在边应该是全部小于6,右边全部大于6,但现在不行了。
所以,我们必须从右边开始,也就是从基准数的对面开始。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗