排序算法之快速排序
程序员文章站
2022-06-04 15:04:51
...
快速排序
快排(简称)是一种分而治之的算法,即就是将要排序的数据分割成独立的两部分,其中一部分的所有数据都要比另外一部分的所有数据要小,按照这种方法对这两部分分别进行快排,重复实现此过程,最后实现整个数据变成有序序列
快排的步骤如下:
以数组a[8]={50,80,95,10,4,56,2,48}为例(数组在程序中可自行输入)
首先从数组中任意选取一个数据(通常选作第一个数据)作为关键数据,然后将所有比它小的数都放在它的前面,比它大的数都放在它的后面,此过程为一趟快排,其算法如下:
1.设置两个变量left、right,排序开始的时候,left=1,right=数组长度-1;
2.以第一个数组元素作为关键数据,赋值给x
3.让right从后向前搜索,遇到第一个小于x的值,将两者交换,right--
4.让left向后搜索,遇到第一个大于x的值,将两者交换,left++
5.重复3,4过程,直到left==right,一趟快排结束
一趟排序的图解过程如下:
完整代码如下:
package wang.second;
public class DemoB {
public static void pintArray(int[] a) {
for (int i = 0; i < a.length; i++)
System.out.print(a[i] + " ");
}
private static void swap(int[] a, int i, int j) {
int t = a[i];
a[i] = a[j];
a[j] = t;
}
public static void quickSort(int[] a, int left, int right) {
int i = left;
int j = right;
boolean t = true; // 作为左右交换遍历 的标志
if (i >= j)
return;
while (i < j) {
if (a[i] > a[j]) {
swap(a, i, j);
t = t ? false : true;
}
// 决定右移还是很左移
if (t)
j--; // 从右向左找第一个小于关键值的数据
else
i++; // 从左向右找第一个大于关键值得数据
// 将数组分成两部分,分别对这两部分进行排序
}
quickSort(a, 0, i - 1);// 左半部分
quickSort(a, j + 1, right);// 右半部分
}
public static void main(String[] args) {
int[] a = new int[] { 50, 80, 95, 10, 4, 56, 2, 48 };
System.out.println("排序之前的数组");
pintArray(a);
// 快速排序
System.out.println("\n排序之后的数组");
quickSort(a, 0, 7);
pintArray(a);
}
}
上一篇: ACM-ICPC 2018 徐州赛区网络预赛-G. Trace
下一篇: 快速排序---对冒泡的改进