最近不是在学习算法吗,然后学到了快速排序,我感觉这个排序挺棒的,然后我就试着自己实现了一下,没想到还真不容易,中途也出现了各种各样的错误,好在我没有放弃,在掉了一地头发之后,终于让我实现了,开心,,,,
首先介绍一下快速排序:
快速排序算法通过多次比较和交换来实现排序,其排序流程如下:
(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。
(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。
(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
(4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。
好了,直接上代码
#include<iostream>
using namespace std;
template<typename T>//可以进行各种数据类型的排序
void Qsort(int left,int right,T arr[])//指向两边
{
if (left < right)//必不可少 否则递归不停
{
//快速排序
int l = left;
int r = right;
int base = arr[left];
while (l < r)
{
//找到左边第一个大于base的数和右边第一个小于base的数并交换
while (l < r&&arr[r] >= base)r--;
while (l < r&&arr[l] <= base)l++;
if (l < r)
{
int temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
}
}
//将base值与l和r 重合的值交换(做到了base左边的数比base小 base右边的数比base大)
arr[left] = arr[l];//注意:此处是小写的L而不是数值1
arr[l] = base;
//用递归对左右两边进行同样的操作
Qsort(left, r - 1, arr);
Qsort(r + 1, right, arr);
}
}
int main()
{
int arr[10];
int i;
for(i = 0; i < 10; i++)
{
cin >> arr[i];//自己输入 可以测试更多组值
}
Qsort(0, 9, arr);
for (i = 0; i < 10; i++)
{
cout << arr[i] << endl;
}
return 0;
}
好了,以上就是我对快速排序的理解啦,可能会有纰漏,望大家指正,谢谢。