一、快速排序(Quick Sort)
- 快速排序 的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
- 算法描述
快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:
步骤1:从数列中挑出一个元素,称为 “基准”(pivot );
步骤2:重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
步骤3:递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。 - 动图演示
- 代码实现:
对数组a = [2,4,6,5,3,1,8,7]进行排序
public class MyQuickSort {
public static void main(String[] args) {
// int[] a = RandomInt(100);
int[] a = {2,4,6,5,3,1,8,7};
myQuickSort(a, 0, a.length-1);
print(a);
}
/**
* 快速排序
*/
public static int[] myQuickSort(int[] array, int left, int right) {
if (left < right){
int mid = partition(array, left, right);
/**递归对数组进行操作**/
myQuickSort(array, left, mid-1);
myQuickSort(array, mid+1, right);
}
else if (array.length == 1){
return array;
}
return array;
}
/**
* 分割数组
*/
public static int partition(int[] array, int left, int right){
int pivot = array[left];
int i = left + 1;//左指针,向右移动
int j = right;//右指针,向左移动
while (true){
/**向左移动找到第一个小于pivot的数**/
while (i <= j && array[i] <= pivot){
i++;
}
/**向右移动找到第一个大于pivot的数**/
while (i <= j && array[j] >= pivot){
j--;
}
/**如果i>j,跳出循环**/
if (i > j){
break;
}
/**交换找到的i,j位置的数**/
swap(array, i, j);
}
/**使中轴元素pivot处于有序的位置**/
swap(array, left, j);
return j;
}
/**
* 交换数组元素
*/
public static void swap(int[] array, int i, int j){
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
//生成随机数组
public static int[] RandomInt(int size){
int [] list1 = new int[size];
for (int i = 0; i<size; i++){
list1[i] = Math.round((int)(Math.random() * 100));
}
return list1;
}
//输出全部数据
public static void print(int[] num){
for (int i = 0; i < num.length; i++){
System.out.print(" "+num[i]);
}
System.out.println(" ");
}
}
- 输出结果:
MyQuickSort
1 2 3 4 5 6 7 8
Process finished with exit code 0