算法之快速排序
这个算法的重点其实是在设置基准数,以及从两边开始向中间走,经过的数与基准数作比较。右边设置下标j,需要优先开始进行向左的遍历,直到找到一个比基准数小的数,否则j–;左边设置下标i,向右遍历,直到找到比基准数大的数,否则i++。此时注意限制条件i必须在j左边,也就是说,i<j,交换i、j对应的数。如果i、j相遇,则将相遇位置的数与基准数交换,这算是完成了第一趟。使得基准数左边的都比基准数小。这种排序方法,每一趟都有一个数可以归位(即基准数可到达正确的位置)。然后再采用递归,将基准数左右两边分别看作两个待排序的子问题,重新设置最左的数为基准数然后排序。
#include <iostream>
using namespace std;
int a[100], n;//全局变量不要在函数里面再去定义了!否则这个全局变量和函数里面的变量就是两个变量!
bool swap(int &a, int &b)
{
int i;
i = a;
a = b;
b = i;
return true;
}
bool quicksort(int left, int right)
{
if (left > right)
return true;
int i, j, k;
k = a[left];
i = left;
j = right;
while (i != j)
{
while (j > i && a[j] >= k)//一定是j先行!
j--;
while (j > i && a[i] <= k)
i++;
swap(a[i], a[j]);
}
swap(a[left], a[i]);
quicksort(left, i - 1);
quicksort(i + 1, right);
}//整个过程里left和right一直是整个数组开头和结尾的下标没有变过。
int main()
{
int i;
cout << "Please enter the number of the numbers:" << endl;
cin >> n;
cout << "Please eeter the numbers:" << endl;
for (i = 0; i < n; i++)
cin >> a[i];
quicksort(0, n - 1);
for (i = 0; i < n; i++)
{
cout << a[i] << '\0';
}
}
这是自己写了第二遍的,本来想画个图来记录一下,但是今天做数学花了太多时间惹!TT!