排序算法

    xiaoxiao2021-12-14  47

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

    首先读入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表示排序方式就排序完成了。 以上。

    转载请注明原文地址: https://ju.6miu.com/read-971802.html

    最新回复(0)