Java实现快速排序(快排)

快速排序是冒泡排序的改进版,也是最好的一种内排序,在很多面试题中都会出现,也是作为程序员必须掌握的一种排序方法。

快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

下面我们用图解来说明一下这个排序算法

假设用户输入了如下数组:

下标

0

1

2

3

4

5

数据

6

2

7

3

8

9

创建变量i=0(指向第一个数据), j=5(指向最后一个数据), k=6(赋值为第一个数据的值)。

我们要把所有比k小的数移动到k的左面,所以我们可以开始寻找比6小的数,从j开始,从右往左找,不断递减变量j的值,我们找到第一个下标3的数据比6小,于是把数据3移到下标0的位置,把下标0的数据6移到下标3,完成第一次比较:

下标

0

1

2

3

4

5

数据

3

2

7

6

8

9

i=0 j=3 k=6

接着,开始第二次比较,这次要变成找比k大的了,而且要从前往后找了。递加变量i,发现下标2的数据是第一个比k大的,于是用下标2的数据7和j指向的下标3的数据的6做交换,数据状态变成下表:

下标

0

1

2

3

4

5

数据

3

2

6

7

8

9

i=2 j=3 k=6

称上面两次比较为一个循环。

接着,再递减变量j,不断重复进行上面的循环比较。

在本例中,我们进行一次循环,就发现i和j“碰头”了:他们都指向了下标2。于是,第一遍比较结束。得到结果如下,凡是k(=6)左边的数都比它小,凡是k右边的数都比它大:

下标

0

1

2

3

4

5

数据

3

2

6

7

8

9

如果i和j没有碰头的话,就递加i找大的,还没有,就再递减j找小的,如此反复,不断循环。注意判断和寻找是同时进行的。

然后,对k两边的数据,再分组分别进行上述的过程,直到不能再分组为止。

注意:第一遍快速排序不会直接得到最终结果,只会把比k大和比k小的数分到k的两边。为了得到最后结果,需要再次对下标2两边的数组分别执行此步骤,然后再分解数组,直到数组不能再分解为止(只有一个数据),才能得到正确结果。

 

 

下面,我们用一个动图,请大家耐心看完

接下来我们用代码实现

package quickSort;

public class QuickSort {
	private static int count;
	/**
	 * 测试
	 * @param args
	 */
	public static void main(String[] args) {
		int[] num = {3,45,78,64,52,11,64,55,99,11,18};
		System.out.println(arrayToString(num,"未排序"));
		QuickSort(num,0,num.length-1);
		System.out.println(arrayToString(num,"排序"));
		System.out.println("数组个数:"+num.length);
		System.out.println("循环次数:"+count);
		
	}
	/**
	 * 快速排序
	 * @param num	排序的数组
	 * @param left	数组的前针
	 * @param right 数组后针
	 */
	private static void QuickSort(int[] num, int left, int right) {
		//如果left等于right,即数组只有一个元素,直接返回
		if(left>=right) {
			return;
		}
		//设置最左边的元素为基准值
		int key=num[left];
		//数组中比key小的放在左边,比key大的放在右边,key值下标为i
		int i=left;
		int j=right;
		while(i<j){
			//j向左移,直到遇到比key小的值
			while(num[j]>=key && i<j){
				j--;
			}
			//i向右移,直到遇到比key大的值
			while(num[i]<=key && i<j){
				i++;
			}
			//i和j指向的元素交换
			if(i<j){
				int temp=num[i];
				num[i]=num[j];
				num[j]=temp;
			}
		}
		num[left]=num[i];
		num[i]=key;
		count++;
		QuickSort(num,left,i-1);
		QuickSort(num,i+1,right);
	}
	/**
	 * 将一个int类型数组转化为字符串
	 * @param arr
	 * @param flag
	 * @return
	 */
	private static String arrayToString(int[] arr,String flag) {
		String str = "数组为("+flag+"):";
		for(int a : arr) {
			str += a + "\t";
		}
		return str;
	}

}

 输出结果为:

数组为(未排序):3	45	78	64	52	11	64	55	99	11	18	
数组为(排序):3	11	11	18	45	52	55	64	64	78	99	
数组个数:11
循环次数:8

 

  • 45
    点赞
  • 133
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
### 回答1: 下面是Java实现快速排序代码: ``` public static void quickSort(int[] array, int left, int right) { if (left < right) { int pivotIndex = partition(array, left, right); // 获取基准值的位置 quickSort(array, left, pivotIndex - 1); // 对左半部分进行快排 quickSort(array, pivotIndex + 1, right); // 对右半部分进行快排 } } private static int partition(int[] array, int left, int right) { int pivot = array[right]; // 取最右边的数作为基准值 int i = left - 1; // 定义i指向数组的第一个元素之前 for (int j = left; j < right; j++) { if (array[j] <= pivot) { i++; swap(array, i, j); // 交换i和j的位置 } } swap(array, i + 1, right); // 交换基准值和i+1位置的值 return i + 1; // 返回基准值的位置 } private static void swap(int[] array, int i, int j) { int temp = array[i]; array[i] = array[j]; array[j] = temp; } ``` 快速排序的基本思想是通过一趟排序将待排序序列分割成独立的两部分,其中一部分的所有元素都比另一部分的所有元素小,然后再按此方法对这两部分分别进行快速排序,整个过程可以递归进行,以此达到排序的目的。 ### 回答2: 快速排序是一种常用的排序算法,使用Java语言实现也比较简单。 快速排序的基本思想是选择一个基准元素,通过一趟排序将待排序序列分割成独立的两部分,其中一部分元素都比基准元素小,另一部分都比基准元素大。然后分别对这两部分递归地进行快速排序,最终将整个序列排序完成。 下面是用Java实现快速排序代码: ``` public class QuickSort { public static void quickSort(int[] array, int low, int high) { if (low < high) { int pivotIndex = partition(array, low, high); // 获得基准元素的位置 quickSort(array, low, pivotIndex - 1); // 对基准元素左边的子序列进行快速排序 quickSort(array, pivotIndex + 1, high); // 对基准元素右边的子序列进行快速排序 } } private static int partition(int[] array, int low, int high) { int pivot = array[low]; // 基准元素 int i = low, j = high; while (i < j) { while (i < j && array[j] >= pivot) { j--; } array[i] = array[j]; while (i < j && array[i] <= pivot) { i++; } array[j] = array[i]; } array[i] = pivot; return i; // 返回基准元素的位置 } public static void main(String[] args) { int[] array = { 9, 5, 7, 1, 3, 6, 8, 2, 4 }; quickSort(array, 0, array.length - 1); System.out.println("排序后的数组:"); for (int num : array) { System.out.print(num + " "); } } } ``` 以上代码定义了一个QuickSort类,其中的quickSort方法用于实现快速排序,partition方法用于选择基准元素并将序列分割。在main方法中,我们创建了一个待排序的数组,然后调用quickSort方法对其进行排序,并输出排序后的结果。 运行以上代码,输出结果为:1 2 3 4 5 6 7 8 9。可以看到,数组已经按照从小到大的顺序排列。 ### 回答3: 快速排序是一种常用的排序算法,在Java中可以很容易地实现快速排序的基本思想是选取一个基准元素,通过一趟排序将数组分为两部分,其中一部分的所有元素都小于基准元素,另一部分的所有元素都大于基准元素,然后递归地对这两部分进行排序。 下面是Java实现快速排序的示例代码: ``` public class QuickSort { public static void quickSort(int[] arr, int left, int right) { if (left < right) { int pivotIndex = partition(arr, left, right); quickSort(arr, left, pivotIndex - 1); quickSort(arr, pivotIndex + 1, right); } } public static int partition(int[] arr, int left, int right) { int pivot = arr[right]; int i = left - 1; for (int j = left; j < right; j++) { if (arr[j] < pivot) { i++; swap(arr, i, j); } } swap(arr, i + 1, right); return i + 1; } public static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } ``` 快速排序的时间复杂度为平均情况下为O(nlogn),最坏情况下为O(n^2),空间复杂度为O(logn)。快速排序是一种稳定的排序算法,适用于大规模数据的排序。 以上是Java实现快速排序的例子,希望对您有帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值