排序算法之快排
思想:快排算法最为核心的思想是分治,即将一个较大规模的问题分为两个或者若干个规模较小且相似的子问题,再将子问题分为更小的问题,直到子问题可以直接求解,原问题的解即是子问题解的合并;
在求解一个输入规模为n,而n的取值又很大的问题时,直接求解往往非常困难。这时,可以先分析问题本身所具有的某些特性,然后从这些特性出发,选择某些适当的设计策略来求解。这种方法,就是所谓的分治法。
解题步骤:
1.确定分界点,注意边界问题
2.根据分界点将数据分区即调整区间;
3.将分区的两边递归处理
C++代码示例:
#include <iostream>
using namespace std;
const int N = 1e6+10;
int q[N];
int n;
void quick_sort(int q[],int left,int right)
{
if(left >= right) return;
// 分界点可以为随机值 ,这里取中间值
int x = q[left+right >> 1],i = left -1,j = right +1;
while(i < j)
{
do i++; while(q[i] < x);
do j--; while(q[j] > x);
// 大于分界点的在右侧,小的在左侧
if(i < j) swap(q[i],q[j]);
}
// 递归 边界 j
quick_sort(q,left,j);quick_sort(q,j+1,right);
}
int main()
{
// 输入问题规模 这里取址更节省效率
scanf("%d",&n);
// 依据问题规模 输入待排序数据
for(int i = 0;i < n; i++) scanf("%d",&q[i]);
quick_sort(q,0,n-1);
// 输出排序后结果
for(int i = 0; i < n; i++)
printf("%d ",q[i]);
return 0;
}
java代码示例:
class Solution {
public int[] sortArray(int[] nums) {
quicksort(nums,0,nums.length-1);
return nums;
}
public void quicksort(int[] nums,int l,int r){
if(l>=r) return;
//确定分界点,以及左右边界
int x = nums[l],i = l-1,j = r+1;
//每次交换
while(i<j){
do{i++;} while(nums[i]<x);
do{j--;} while(nums[j]>x);
//如果两个指针还没有相遇,就交换一下
if(i<j) swap(nums,i,j);
}
//递归处理左右两边(分治了)
quicksort(nums,l,j);
quicksort(nums,j+1,r);
}
public void swap(int[] nums,int l,int r){
int temp = nums[l];
nums[l] = nums[r];
nums[r] = temp;
}
}