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,但现在不行了。

所以,我们必须从右边开始,也就是从基准数的对面开始。
————————————————
版权声明:本文为CSDN博主「良月柒」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lkp1603645756/article/details/85008715


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值