快速排序算法
思想
- 选择数组中一个数 x x x进行比较,小于等于 x x x的放在前面,大于 x x x的放在后面
- 这样可以形成 “小于等于 x x x的”+ x x x +“大于 x x x的” 的数组
- 再对两端进行递归该操作,直到数组长度为1
不同于归并排序,这个是从上到下,进行分解排序
过程可看这个快速排序过程
代码
void quickSort(int *arr, int begin, int end)
{
if(begin >= end)
return;
int temp = arr[begin];
int i = begin, j = end;
while(i<j)
{
while(i<j && arr[i]<=temp)
i++;
arr[j]=arr[i];
while(i<j && arr[j]>temp)
j++;
arr[i]=arr[j]
}
arr[i]=temp;
quickSort(arr, begin, i-1);
quickSort(arr, i+1, end);
}
运用
1.求第k大的数字
因为每次设置的 x x x知道它的排序在 m m m位,
- 如果 m = = k m==k m==k,那么 x x x就是目标值
- 如果 m < k m < k m<k,那么目标值就在后半段,进入查找
- 如果 m > k m > k m>k,那么目标值就在前半段,进入查找
int getOrder(int *arr, int begin, int end)
{
int temp = arr[begin];
int i = begin, j = end;
while(i<j)
{
while(i<j && arr[i]<=temp)
i++;
arr[j]=arr[i];
while(i<j && arr[j]>temp)
j++;
arr[i]=arr[j]
}
arr[i]=temp;
return i+1;//因为是顺序,所以+1
}
int getK(int k, int *arr, int begin, int end)
{
int order = getOrder(arr, begin, end);
if(order == k)
return arr[k-1];
else if(order < k)
return getK(k, arr, begin, k-2);
else
return getK(k, arr, k, end);
}