c语言 算法 排序

作者&投稿:刁亨 (若有异议请与网页底部的电邮联系)
C语言排序算法一共多少种~

选择排序
#include using namespace std;void select_sort(int arr[], int num);void output_array(int arr[], int num);int main(){ int a[10]; for(int i=0; i>a[i]; } select_sort(a,10); output_array(a,10); return 0;}void select_sort(int array[],int n) //形参array是数组名{ int i,j,k,t; for(i=0; i<n-1; i++) { k=i; //先设第i个就为最小 for(j=i+1; j<n; j++) if(array[j]<array[k]) k=j; //通过循环,得到k为最小 t=array[k]; //交换a[i]和a[k] array[k]=array[i]; array[i]=t; } return;}void output_array(int arr[], int num){ int i; for(i=0; i<num; i++) { cout<<arr[i]; cout<<endl; } return;}2.冒泡排序
#includeint main(){int i,j,a[10],t;for(i=0;ia[j]){t=a[j];a[j]=a[i];a[i]=t;}for(i=0;i<10;i++)printf("%d ",a[i]);return 0;}3.堆排序
#includeusing namespace std;void paidui(int a[20],int i,int m){int k,t; t=a[i]; k=2*i+1; while (k=0;i--) paidui(a,i,n); for (i=n-1; i>=1; i--) { k=a[0]; a[0]=a[i]; a[i]=k; paidui(a,0,i); }}int main() { int a[10],i; for(i=0;i>a[i];duipai(a,10); for(i=0;i<10;i++)cout<<a[i]<<endl;}4.快速排序
#includeusing namespace std;void Quicksort(int a[],int low,int high){ if(low>=high) { return; } int first=low; int last=high; int key=a[first]; while(first=key) --last; a[first]=a[last]; while(first>x){a[n]=x;n++;}n--;Quicksort(a,0,n);for(i=0;i<=n;i++)cout<<a[i]<<" ";cout<<endl; return 0;}5. 基数排序
#include #include int main(){int data[10]={73,22,93,43,55,14,82,65,39,81}; //对十个数进行排序int temp[10][10]={0}; //构造一个临时二维数组,其值为0int order[10]={0}; //构造一维数组,其值为0int i,j,k,n,lsd;k=0;n=1;for (i=0;i<10;i++) printf("%d ",data[i]); //在排序前,对这10个数打印一遍putchar('
');while (n<=10){for (i=0;i<10;i++){lsd=((data[i]/n)%10); //lsd先对个位取余,然后再对十位取余,注意循环temp[lsd][order[lsd]]=data[i]; //temp[3][0]=73,temp[2][0]=22,temp[3][1]=93,temp[3][2]=43,⋯⋯order[lsd]++; //需要区分的是lsd和order[lsd],这两个不是一样的概念嗷}printf("
重新排列: ");for (i=0;i<10;i++){if(order[i]!=0)for (j=0;j<order[i];j++){data[k]=temp[i][j];printf("%d ",data[k]);k++;}order[i]=0;}n*=10; //第二次用十位k=0;}putchar('
');printf("
排序后: ");for (i=0;i<10;i++) printf("%d ",data[i]);return 0;}6.希尔排序
#includeusing namespace std;void shell_sort(int a[],int n);int main(){ int n,a[10000]; cin>>n; for(int y=0;y>a[y]; shell_sort(a, n); for(int i=0; i0; gap--)//设置初始增量,递减; { for(int i=0; i=0&&a[k]>temp) { a[k+gap] = a[k]; k = k-gap; } a[k+gap] = temp; } } } }}7.归并排序
#includeusing namespace std;void MergeSort(int p[],int s,int m,int t){ int q[100]; //q[100]用来存放排好的序列 int i=s; int j=m+1; int k=s;while(i>n; for(int i=0; i>p[i]; Merge(p,0,n-1); for(int j=0;j<n;j++) cout<<p[j]<<" "; cout<<endl; return 0; }排序方法基本就这些,还有双向冒泡这种拓展的排序方法,还有直接排序如桶排序

用C语言编写通过if将3个数排序:
#include/*函数头:输入输出头文件*/
void main()/*空类型:主函数*/
{
inta,b,c,t;/*定义变量的数据类型为整型*/
printf("输入3个数,中间用空格隔开:");/*输出文字提示*/
scanf("%d%d%d",&a,&b,&c);/*输入3个数字*/
if(a<b)/*判断a是否小于b*/
{t=a;a=b;b=t;}/*是,则a、b的值互换*/
if(a<c)/*判断a是否小于c*/
{t=a;a=c;c=t;}/*是,则a、c的值互换*/
if(b<c)/*判断b是否小于c*/
{t=b;b=c;c=t;}/*是,则b、c的值互换*/
printf("从小到大:%d,%d,%d
",c,b,a);/*输出从小到大排列的数*/
printf("从大到小:%d,%d,%d
",a,b,c);/*输出从大到小排列的数*/
}

扩展资料
输入三个数,比较其大小,并从大到小输出。
#include
int main(){
inta,b,c;
scanf("%d%d%d",&a,&b,&c);
if(a<b){
intflag=a;
a=b;
b=flag;
}
if(a<c){
intflag=a;
a=c;
c=flag;
}
if(b<c){
intflag=b;
b=c;
c=flag;
}
printf("%d%d%d",a,b,c);
}

第二种算法中,在第二层循环,每找到一个大数就要和a[i]进行交换,交换的次数多,所以效率低。
第一种算法,在第二层循环,每找到一个大数,就把这个数的索引记录成k,然后继续循环,最后把找到的最大的数与a[i]交换,交换的次数少,所以效率高一些。

for(i=0;i<N-1;i++)
{
for(j=0;j<N-1-i;j++)
{
if(a[j+1]<a[])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
此为冒泡排序
for(i=0;i<N-1;i++)
{
k=i;
for(j=i+1;j<N;j++)
{
if(a[j]<a[k])
{
k=j;
t=a[k];
a[k]=a[i];
a[i]=t;
}
}
}
此为选择排序,你的两段代码第一段不需要if(i!=k),第二段错了,都没声明k是多少

前者是选择排序,后者是冒泡排序
选择排序算是对冒泡的改进

功能都是一样的,区别就是算法实现不一样

下面这个类似冒泡吧


嘉定区18456522861: c语言中的排序算法? -
莫寿眩晕: 选择,冒泡,快排,堆排,基数,计数,二叉树,插入,归并,希尔排序,等等..

嘉定区18456522861: C语言对N个数进行排序 -
莫寿眩晕: #define N=10;//对10个数排序 main() { int a[N]; int i,j,t; printf("input 10 numbers:\n"); for(i=1;i<=10;i++) scanf("%d",&a[i]); printf("\n"); for(j=1;j<=9;j++) for(i=1;i<=10-j;i++) if(a[i]>a[i+1]) {t=a[i];a[i]=a[i+1];a[i+1]=t;} printf("the sorted numbers is:\n"); for(i=1;i<=10;i++) printf("%d",a[i]); }

嘉定区18456522861: C语言中的排序法 -
莫寿眩晕: c语言中排序法有选择法和冒泡法是最常见的. 1冒泡法对10个数排序 #include<stdio.h> void main () { int a[10]; int i,j,t; printf("please input 10 numbers:\n"); for(i=0;i<10;i++)scanf("%d",&a[i]); printf("\n"); for(j=0;j<9;j++) //进行9次循环,实...

嘉定区18456522861: c语言给n个数排序 -
莫寿眩晕: 常用的排序算法有:冒泡排序、选择排序、堆排序、SHELL排序、快速排序、归并排序、磁盘排序等等.但是每种排序算法都是各有优缺点.现在已经有 C 语言版的数据结构,且具有 C 语言源程序的教材可供参考.现在的主要任务是:只需要自己在程序开头数据类型定义部分、以及子函数调用部分,根据自己的任务需求,把教材上的数据类型,修改为自己需要的数据类型即可,非常容易.

嘉定区18456522861: 使用C语言编程实现排序算法 -
莫寿眩晕: #include<stdio.h> main() { struct { char mz[5]; int sd; char sbing[5]; int xs; }a[100],k; int i,b,j; printf("请输入球员数量\n"); scanf("%d",&b); for(i=0;i<b;i++) {printf("请输入第%d个球员的信息\n",i+1); printf("名字:"); scanf("%s",a[...

嘉定区18456522861: 用C语言写一个快速排序法,不要用库函数 -
莫寿眩晕: include<stdio.h> void main() {int a[]={8,4,24,1,54,87,113,39};//这里的元素可以手动输入,用for循环输入,先给定数组长度N //再一次输入数组元素 /* int n; scanf("&%d",n); for(int =0;i<n;i++)scanf("&%d",&a[i]); */ for(int i=0;i<8;i++){for(int j...

嘉定区18456522861: c语言 (排序算法)随机输入10个整数,将其从大到小排序并输出. -
莫寿眩晕: #include<stdio.h> void main() { int a[10],i,j,t; for(i=0;i<10;i++) { scanf("%d",&a[i]); } printf("\n"); for(j=0;j<9;j++) { for(i=j+1;i<10;i++) { if(a[j]<a[i]) t=a[i]; a[i]=a[j]; a[j]=t; } } for(i=0;i<10;i++) { printf("%d",a[i]); printf(" "); } printf("\n"); }

嘉定区18456522861: C语言的快速排序的算法是什么啊? -
莫寿眩晕: 快速排序(Quicksort)是对冒泡排序的一种改进.由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数...

嘉定区18456522861: 用C语言编程实现快速排序算法 -
莫寿眩晕: 给个快速排序你参考参考 /********************** 快速排序 **************************** 基本思想:在待排序的n个记录中任取一个记录(通常取第一个记录), 以该记录为基准,将当前的无序区划分为左右两个较小的无 序子区,使左边的记录均小于基...

嘉定区18456522861: C语言实现七种排序算法的 演示代码!!!
莫寿眩晕: (1)“冒泡法” 冒泡法大家都较熟悉.其原理为从a[0]开始,依次将其和后面的元素比较,若a[0]&gt;a[i],则交换它们,一直比较到a[n].同理对a[1],a[2],...a[n-1]处理,即完成排序.下面列出其代码: void bubble(int *a,int n) /*定义两个参数:数组...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网