数组排序——快速排序
1、数组排序之快速排序
一趟快速排序的算法是:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即 key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j=j-1即j--),找到第一个小于key的值A[j],A[i]与A[j]交换;
4)从i开始向后搜索,即由前开始向后搜索(i=i+1即i++),找到第一个大于key的A[i],A[i]与A[j]交换;
5)重复第3、4、5步,直到 I=J;
(3, 4 步是在程序中没找到时候j=j-1,i=i+1,直至找到为止。找到并交换的时候i、 j指针位置不变。另外,当i=j这过程一定正好是i+或j-完成的最后令循环结束。)
2、代码演示
package cn.itcast_01;
public class ArraySort_quickSort {
public static void main(String[] args) {
// 定义一个数组
int[] arr = { 11, 3, 454, 231, 87, 334, 0, -55, 2, 66 };
// int[] arr = { 24 };
// int[] arr = {};
System.out.println("排序前:");
printArray(arr);
// 调用冒泡排序算法
int n = arr.length;
quickSort(arr, 0, n - 1);
System.out.println("排序后:");
printArray(arr);
}
// 快速排序法 quickSort()+partition()
// 一次划分算法
public static int partition(int r[], int first, int end) {
int i = first; // 指向头
int j = end; // 指向尾
int temp = 0; // 辅助变量
while (i < j) // i==j时跳出循环
{
while (i < j && r[i] < r[j]) // 右侧扫描
j--;
if (i < j) {
temp = r[i];
r[i] = r[j];
r[j] = temp;
i++;
}
while (i < j && r[i] < r[j]) // 左侧扫描
i++;
if (i < j) {
temp = r[i];
r[i] = r[j];
r[j] = temp;
j--;
}
}
return i;
}
// 快速排序递归算法
public static void quickSort(int r[], int first, int end) {
int pivot = 0;
if (first < end) {
pivot = partition(r, first, end);
quickSort(r, first, pivot - 1); // 前半部分递归
quickSort(r, pivot + 1, end); // 后半部分递归
}
}
// 数组遍历
public static void printArray(int[] arr) {
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
if (i == arr.length - 1) {
System.out.print(arr[i]);
} else {
System.out.print(arr[i] + ", ");
}
}
System.out.println("]");
}
}