排序算法

来源:互联网 发布:网络保本理财产品排行 编辑:程序博客网 时间:2024/06/04 19:13

排序的方法有很多,各有优劣。这里介绍四种简单的排序算法。


首先读入n(n<=20)个整数并存入数组a[ ]中。

int a[20],n;cin>>n;for(int i=0;i<n;i++)cin>>a[i];

方法一:选择法排序(升序排列

基本思路:0、从a[0]~a[n-1]这n个数中找出最小的数,和a[0]交换;

  1、从a[1]~a[n-1]这n-1个数中找出最小的数,和a[1]交换;

  ………………………………………………………………

       n-2、从a[n-2]~a[n-1]这2个数中找出最小的数,和a[n-1]交换。(一共要找n-1次)

代码实现:

for(int i=0;i<n-1;i++)//一共循环n-1次 {    int k=i; //k用来记录最小数的下标,初始为当前下标     for(int j=i+1;j<n;j++) /*从a[i+1]~a[n-1] 找出其中的最小值,        if(a[j]<a[k]) k=j;把下标赋值给k (若需要降序排列,把<改成>即可*/    int temp=a[k]; a[k]=a[i]; a[i]=temp;//最小值与a[i]交换位置 }



方法二:冒泡法排序(升序排列)

基本思路:1、从数组a[0]a[n-1],把相临的两个数两两进行比较。即a[0]a[1]比较,比较完后a[1]再与a[2]比较,……最后是a[n-2]a[n-1]比较。

  2、在每次进行比较的过程中,如果前一个数比后一个数大,则对调两个数。
  3、上述过程已经把n个数中最大的数放到了a[n-1]中,再重复上述算法,把a[0]到a[n-2]中最大的数放到a[n-2]中,这样        a[n-2]中存放的就是第二大的数;…… 
代码实现:
for(int i=0;i<n-1;i++){    for(int j=0;j<n-1-i;j++)//-i是因为随着循环的进行,最后几个数都已经确定了    {        if(a[j]>a[j+1])//如果前一个数大于后一个数,则交换。若需要降序排列,把>改成<即可{int temp=a[j];a[j]=a[j+1];a[j+1]=temp; }     }}



方法三:插入法排序(升序排列)
基本思路:1、第一个输入的数作为a[0],
  2、之后每输入一个数,从最后一个数向前依次和数组的元素比较,
  3、若新输入的数比当前数组元素a[i]小,则把该数组元素向后移动一个a[i+1]=a[i];否则表示新输入的数比该数组前面的数都要大,则插入当前位置的下一个a[i+1]
代码实现:
int N,n,x,i,a[20];/* N表示输入的元素个数;n用来记录已输入的元素个数; cin>>N;   x用来暂时存储新输入的数 */ cin>>a[0]; n=1;//第一个输入的数作为a[0] while(n<N){    cin>>x;    for(i=n-1;i>=0;i--)//从最后一个数开始向前移动         if(x<a[i]) a[i+1]=a[i];//依次和新输入的数比较。若比较大,则往后移一个;         else break;//否则退出循环,表示新输入的数比前面的数都大     a[i+1]=x;//直接存入数组的当前位置     n++;//数组个数+1 }

方法四:使用排序函数sort()     (虽然方便,但是不推荐啊。初学者还是最好自己动手写一下,不要偷懒哦)
首先要
#include<algorithm>
然后只要
sort(a,a+n);//a表示数组名,n表示要排序的元素个数(其实是begin和end)
就排序完成了。
注意,该函数默认升序排列。

降序排列的方法:
首先要自己写一个比较函数
bool cmp(int a,int b)//compare {return a>b;   //降序排列(第一个参数大于第二个参数),如果改为return a<b,则为升序排列 }
然后只要
sort(a,a+n,cmp);//a表示数组名,n表示要排序的元素个数(其实是begin和end),cmp表示排序方式
就排序完成了。


以上。









0 0
原创粉丝点击