数据排序是信息获取后对数据进行处理的方式之一,其方法有以下几种,我们要根据题目的要求选择适当的排序方法。
1.选择排序
(1)基本思想:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在待排序的数列的最前,直到全部待排 序的数据元素排完。
(2)程序实现方法:用两层循环完成算法,外层循环i控制当前序列最小值存放的数组位置,内层循环j控制从i+1到n序列中选择 最小的元素所在位置k。
(3)程序循环部分表达方式:
for(int i=0;i<n;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(a[j]<a[k]) k=j;
if(k!=i)
{
temp=a[i];a[i]=a[k];a[k]=temp;
}
}
2.冒泡排序
(1)基本思想:相邻的两个数据进行比较,按题目要求决定是否需要交换位置,依次类推。排序过程中,大数慢慢地往后,相 当于气泡上升,所以叫冒泡排序。
(2)程序实现方法:用两层循环完成算法,外层循环i控制每轮要进行多少次的比较,第1轮比较n-1次,第2轮比较n-2次, ……,最后一轮比较1次。内层循环j控制每轮i次比较相邻两个元素是否逆序,若逆序就交换这两个元素。
(3)冒泡排序有三种表达方式:
a. for (inti=n-1;i>=1;i--)
{
for ( int j=0;j<i; j++)
{
If(a[j]>a[j+1])swap(a[j],a[j+1]);
}
}
b. for ( int i=1;i<=n-1;i++)
{
for(int j=1;j<=n-i ; j++)
{
if(a[j]>a[j+1])
swap(a[j],a[j+1]);
}
}
c.(改进版)bool ok;
for(int i=n-1;i>=1;i--)
{
ok=true;//判断是否有交换
for(intj=1;j<=i;j++)
{
If(a[j]>a[j+1])
{
swap(a[j],a[j+1]);
ok=false;
}
}
If(ok==true) break;//没有交换就退出
}
3.插入排序
(1)基本思想:这种排序的过程就像你在抓牌时对扑克牌排序一样,当抓完所有的牌时,手中的牌便是有序的,这种排序方法 即为插入排序。
(2)实现方法:当读入一个元素时,在已经排序好的序列中,搜寻它正确的位置,再放入读入的元素。但要注意:在插入这个元 素之前,应当先将它后面的所有元素后移一位,以保证插入位置的原元素不会被覆盖。
(3)实现过程:
for(inti=0;i<n;i++)
{
for(j=i-1;j>=0;j--)
if(a[j]<a[i]) break;
if(j!=i-1)
{
temp=a[i];
for(int k=i-1;k>j;k--)
a[k+1]=a[k];
a[k+1]=temp;
}
}
4.桶排序
(1)基本思想:若待排序的值在一个明显有限范围内时,可设计有限个有序桶,待排序的值装入对应的桶,桶号就是待排序的值, 顺序输出各桶的值,将得到有序的序列。
(2)实现过程:
int b[101],n,i,j,k;
memset(b,0,sizeof(b));
cin>>n;
for(i=1;i<=n;i++)
{
cin>>k;b[k]++;
}
for(i=0;i<=100;i++)
while(b[i]>0)
{
cout<<i<<””;
b[i]--;
}
5.快速排序
(1)基本思想:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可以分 别对着两部分记录继续进行排序,以达到整个序列有序。
(2)实现方法:附设两个指针i和j,它们的初值分别为l和r,设枢轴记录取mid,则首先从j所指位置起向前搜索找到第一个关键字小 于mid的记录,然后从i所指位置起向后搜索,找到第一个关键字大于mid的记录,将它们互换,重复这两步直至i>j为止。
(3)实现过程:
void qsort(int l,int r)
{
int i,j,mid,p;
i=l;j=r;
mid=a[(l+r)/2];
do
{
while(a[i]<mid) i++;
while(a[j]>mid) j--;
if(i<=j)
{
p=a[i];a[i]=a[j];a[j]=p;
i++;j--;
}
}
while(i<=j);
if(l<j)qsort(l,r);
if(i<r) qsort(i,r);
}
int main()
{
int n,i;
cin>>n;
for(i=1;i<=n;i++)cin>>a[i];
qsort(1,n);
for(i=1;i<=n;i++)
cout<<a[i]<<”“;
cout<<endl;
}
6.sort函数排序
(1)从小到大排序(a为数组a,k为数组a内元素的个数)
若循环内i=0,则应表示为sort(a,a+k).
若循环内i=1,则应表示为sort(a+1,a+1+k).
(2)从大到小排序
从大到小排序应该先定义一个函数(如下:)
boolcomplare(int a,int b)
{
return a>b;
}
然后 sort(a,a+k,complare)
或者 sort(a+1,a+1+k,complare)//解释如(1)