问题:对“6 1 2 7 9 3 4 5 10 8”十个数进行排序
首先选一个基准数,为了方便,我们就选第一个数6作为准基数吧。
我们想把准基数6放到它准确的位置,就是排序好后的位置
我们想把比6小的都放在6的左边,比6大的都放在6的右边,那么6的位置就排序好了
我们假设序列两端都有一个箭头,一个从左端开始找第一个比6大的,一个从右端开始找第一个比6小的,然后交换两者的位置。
此时整个序列可分为两段,比6小的和比6大的,分别对两段进行同样的操作,即分别重新选取基准数,再重复上面排序的过程如此类推,直到所有的元素都排序好位置。
#include <stdio.h>
#include <iostream>
using namespace std;
int a[101],n;//定义全局变量,这两个变量需要在子函数中使用
void quicksort(int left,int right)
{
int i,j,t,temp;
if(left>right)
{
return;
}
temp = a[left]; //temp中存的就是基准数
i=left;
j=right;
while(i!=j)
{
//顺序很重要,先从右往左找
while(a[j]>=temp && i<j)
{
j--;
}
//再从左往右找
while(a[j]<=temp && i<j)
{
i++;
}
//交换两个数在数组中的位置
if(i<j)//当i和j没有相遇
{
t = a[j];
a[j] = a[i];
a[i] = t;
}
}
//最后让准基数归位
a[left] = a[i];
a[i] = temp;
quicksort(left, i-1);
quicksort(i+1,right);
return;
}
int main()
{
int i;
//读入数据
cin>>n;
for(i = 1;i<=n;i++)
{
cin>>a[i];
}
quicksort(1,n);//快速排序调用
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
getchar();
getchar();
return 0;
}