快速排序
看别人写的快排程序,看了很久才看懂。于是搜了很多文章学习一下
先献上两个视频:
一个是匈牙利的舞蹈:https://v.qq.com/x/page/w01315ff3b6.html
一个是c语言实现的快排:https://video.tudou.com/v/XMTc5MjQ3NTkwNA==.html?__fr=oldtd
还推荐一篇可视化的算法:https://www.cnblogs.com/onepixel/articles/7674659.html (推荐先看这个)
基本的思想估计大家都有了解了,就是:从待排序序列中找到一个关键字(默认为第一个元素) 然后将比关键字少的数据排列在左边,大于关键字的排在右边,然后对关键字左右两边的序列继续上面步骤,直至关键字两边的序列都已经排好序。
我一开始按着有些人将最左边的数作为支点pivot,看得很晕。所以我推荐大家先从将支点设为中间,实现了以后再类比去理解将支点设为最左边的情况。
大致的过程就是首先有左右两个指针,不停的向中间支点移动,如果左指针找到比pivot大的并且右指针找到pivot小的,就将两个指针位置的数交换,交换完继续向pivot移动。我们先把这段代码实现:
public static void quickSort(int[] numbers,int low,int high)
{
int i = low;
int j = high;
int povit = numbers[(low+high)/2];
while(i<j) {
while(numbers[i]<povit) {
i++;
}
while(numbers[j]>povit) {
j--;
}
if(i<=j) {
int temp = numbers[i];
numbers[i]=numbers[j];
numbers[j]=temp;
i++;
j--;
}
}
直到一种情况出现,就是左指针到了右指针的右边,也就是i<j 我们就将左右两边的数组重新进行一趟快排。以此循环往复就是我们所谓的递归:我们在上面的代码加入递归部分
public static void quickSort(int[] numbers,int low,int high)
{
int i = low;
int j = high;
int povit = numbers[(low+high)/2];
while(i<j) {
while(numbers[i]<povit) {
i++;
}
while(numbers[j]>povit) {
j--;
}
if(i<=j) {
int temp = numbers[i];
numbers[i]=numbers[j];
numbers[j]=temp;
i++;
j--;
}
}
if(j>low) {
quickSort(numbers,low,j);
}
if(i<high) {
quickSort(numbers,i,high);
}
}
然后主函数设置一个数组测试一下就可以了,你可以按着我的思路自己敲一遍就理解了。
public static void main(String[] args) {
int[] numbers= {13,12,34,54,67,37,22,1,99};
quickSort(numbers,0,8);
for(int a:numbers)
System.out.print(a+" ");
}
结果如下