快排问题
今天又复习了下快速排序,主要思想是先把数组的最左边的这个数作为一个基准数,然后在通过类似二分法把大于基准数的数放在右边,小于基准数的数放在左边。这就是其主要思想。
c++代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
int a[11];
void quick_sort(int begin,int end)
{
//temp作为基准数
int temp = a[begin];
int i = begin;
int j = end;
if(begin > end)
return;
while(i < j)
{
while(a[j] >= temp && i < j)
{
j --;
}
while(a[i] <= temp && i < j)
{
i ++;
}
if(i < j)
{
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
//把基准数放到它的位置
a[begin] = a[i];
a[i] = temp;
quick_sort(begin,i - 1);
quick_sort(i + 1,end);
}
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; i ++ )
scanf("%d",&a[i]);
quick_sort(1,n);
for(int i = 1; i <= n; i ++)
cout << a[i] << " ";
return 0;
}
这里得注意的一点是你必须从右边开始进行判断从而 j- -,假设你从左边开始的话,当你找到大于基准数的数时,你就得使基准数与你找到的这个数进行交换,而我们快排的思想是使小于基准数的数放在左边,违背了基本思想。则可能会出现问题。而从右边开始,即使找到一个小于基准数的数,进行交换也无大碍。