标签:最小值 扫描 它的 int 比较 log amp quick 实现
快速排序是冒泡排序的改进版,主要思想:
1.在待排序的元素内任取一个元素作为基准(通常选第一个元素,但最好的选择方法是从待排序元素中随机选取一个作为基准),称为基准元素;
2.将待排序的元素进行分区,比基准元素大的元素放在它的右边,比其小的放在它的左边;
3.对左右两个分区重复以上步骤直到所有元素都是有序的;
举例说明:待排序数组 int[] {5 7 1 8 4}
1.把5作为与其它元素比较的基准元素,设两个指针right与left;
2.right指针从右向左扫描,首先4和5比较,4<5,拆4,补原元素5的空缺位,left指针右移;
3.7和5比较,7>5,拆7补原元素4的空缺位,right指针左移;
4.8和5比较,8>5,保持不变,right指针继续左移;
5.1和5比较,1<5,拆1补原元素7的空缺位,left指针右移,此时left=right,则将基准元素5补入到right/left的位置,结束这一趟拆补工程,往下继续递归。
代码实现:
public class Test {
public static void main(String[] args) {
int[] arr = {6, 3, 8, 2, 9, 1};
System.out.println("排序前数组为:");
for(int i : arr) {
System.out.print(i + ", ");
}
System.out.println();
quickSort(arr, 0, arr.length-1);
System.out.println("排序后数组为:");
for(int i : arr) {
System.out.print(i + ", ");
}
}
public static void quickSort(int[] arr, int _left, int _right) {
int left = _left;
int right = _right;
int tmp = 0;
if(left <= right) { //待排序的元素至少有两个的情况
tmp = arr[left]; //待排序的第一个元素作为基准元素
while(left != right) { //从左右两边交替扫描,直到left = right
while(right > left && arr[right] >= tmp) {
right--; //从右往左扫描,找到第一个比基准元素小的元素
}
arr[left] = arr[right]; //找到后与arr[left]交换
while(right > left && arr[left] <= tmp) {
left++; //从左往右扫描,找到第一个比基准元素大的元素
}
arr[right] = arr[left]; //找到后与arr[right]交换
}
arr[right] = tmp; //基准元素归位
quickSort(arr, _left, left-1); //对基准元素左边的元素进行递归排序
quickSort(arr, right+1, _right); //对基准元素右边的元素进行递归排序
}
}
}
当分区选取的基准元素为待排序元素中的最大或最小值时,为最坏情况,时间复杂度为O(n^2);
当分区选取的基准元素为待排序元素中的“中值”,为最好情况,时间复杂度为O(nlog2^n),平均也按此计算;
快速排序的空间复杂度为O(log2^n);
快速排序为一种不稳定的排序。
标签:最小值 扫描 它的 int 比较 log amp quick 实现
原文地址:https://www.cnblogs.com/yuanfei1110111/p/10201781.html