快速排序-1
前言:
相信大家对基础的冒泡选择插入都有了解,我就先不说这三种。我今天要说的是有点陌生的快速排序,希望大家能有所收获。
正文:
基本思想:
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
简单来说就是找一个数(一般是开头那个)做基准值,一轮操作后,比基准值大的在它右边,比它小的在左边,然后再对剩余部分再进行同样算法。
如何操作:
先进行一轮操作把:
看这10个数字
5, 3, 9, 4, 8, 6, 2, 0, 1, 7
1.选取5为基准值
2.从右开始往左遍历,如果比5大,不操作,若比5小,就和5交换,交换之后停止遍历,并且记录该位置
得到1, 3, 9, 4, 8, 6, 2, 0, 5, 7
3.然后从左开始往右遍历,如果比5小,不操作,若比5大,就和5交换,交换之后停止遍历,记录该位置
得到1, 3, 5, 4, 8, 6, 2, 0, 9, 7
在上述记录的位置开始再重复2和3,直到记录的位置相同,算法停止,一轮操作结束。
依次得到
1,3,0,4,8,6,2,5,9,7
1,3,0,4,5,6,2**,8**,9,7
1,3,0,4,2,6,5,8,9,7
1,3,0,4,2,5,6,8,9,7
这时,比5小的都在左边,比5大的都在右边。
其实你有没发现我们也可以不用真的去交换5这个数,只要知道5的位置就好了,到最后再补上也可。
即
1, 3, 9, 4, 8, 6, 2, 0, 1, 7
1, 3, 9, 4, 8, 6, 2, 0, 9, 7
1,3,0,4,8,6,2,0,9,7
1,3,0,4,8,6,2,8,9,7
1,3,0,4,2,6,2,8,9,7
1,3,0,4,2,5,6,8,9,7
这个可能不好理解,建议连着代码一起看
附上代码
//进行一轮操作
#include <cstdio>
#include <iostream>
using namespace std;
int a[10] = {5, 3, 9, 4, 8, 6, 2, 0, 1, 7};
void quicksort_one(int a[10], int l, int r)
{
if (l < r)
{
int left = l;
int right = r;//初始位置记录
int t = a[l];
while (left < right)
{
while (left < right && a[right] >= t)
{
right--;
}
if (left < right)
{
//a[right] = t;
a[left] = a[right];
left++;
}
while (left < right && a[left] <= t)
{
left++;
}
if (left < right)
{
//a[left]=t;
a[right] = a[left];
right--;
}
}
a[left] = t;//最后补上空
}
}
int main()
{
for (int i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
quicksort_one(a, 0, 9);
printf("\n");
for (int i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
return 0;
}
运行结果
5 3 9 4 8 6 2 0 1 7
1 3 0 4 2 5 6 8 9 7
接下来是递归调用:
其实就是和二叉树顺序查找类似。
附上代码
#include <cstdio>
#include <iostream>
using namespace std;
int a[10] = {5, 3, 9, 4, 8, 6, 2, 0, 1, 7};
void quicksort(int a[10], int l, int r)
{
if (l < r)
{
int left = l;
int right = r;
int t = a[l];
while (left < right)
{
while (left < right && a[right] >= t)
{
right--;
}
if (left < right)
{
a[left] = a[right];
//a[right] = t;
left++;
}
while (left < right && a[left] <= t)
{
left++;
}
if (left < right)
{
a[right] = a[left];
//a[left]=t;
right--;
}
}
a[left] = t;
quicksort(a, l, right - 1);//递归
quicksort(a, right + 1, r);//递归
}
}
int main()
{
for (int i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
quicksort(a, 0, 9);
printf("\n");
for (int i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
return 0;
}
运行结果
5 3 9 4 8 6 2 0 1 7
0 1 2 3 4 5 6 7 8 9