1.【基本思路】
选择排序,都会在一个序列当中选择一个基数,我这里选择最后一个数为基数,小于基数的放在左边,大于基数的放在右边。
这里要采用分治算法:
这里有一个序列
i=0;//i的位置一直会是比基数大的前面一个元素的位置
j=1;//j用来寻找比基数小的数
temp=data[right]//基数选择最左边一个
如果data[j]<=temp当小于我们的基数的时候,就应该放在基数的左边这个时候i++,swap(a[j],a[i])的位置。
1 | 3 | 7 | 2 | 5 |
---|
这个序列经过一次排序以后变成。
1 | 3 | 2 | 5 | 7 |
---|
接下来就可以分为两段,5的左边为一段,5的右边为一段。
后面每一段的排序,过程和前面一样。
2.【代码】
#include <bits/stdc++.h>
using namespace std;
/*函数功能:进行排序,将大于基数的放在右边,小于基数的放在左边
函数参数:需要排序元素首地址,需要排序元素右边下标,和左边下标
函数返回值:基数的位置
*/
int getstrlen(int *data,int left,int right)//治
{
int temp=data[right],i=left-1;//这里我们选取最后一个元素作为基数
for(int j=left;j<right;j++)
{
if(data[j]<=temp)//j作为移动的,i永远是大于基数的前面一个数
{
i++;
swap(data[i],data[j]);//找到比我们基数小的数就放在左边
}
}
swap(data[i+1],data[right]);
return i+1;
}
/*
函数功能:把一个序列分为很多个小段
函数参数:需要排序数组的首地址,需要排序序列的左下标和右下标
函数返回值:无
*/
void sort(int *data,int left,int right)//分
{
int i=0;
if(left>=right)
return;
i=getstrlen(data,left,right);
sort(data,left,i-1);
sort(data,i+1,right);
}
int main()
{
int a[1000],n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a,1,n);
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}
仅供参考!