
正文
c语言的排序函数有多少种 c语言排序总结
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
C语言排序算法一共多少种
选择排序
#include iostream
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; i10; i++)
{
cina[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; in-1; i++)
{
k=i; //先设第i个就为最小
for(j=i+1; jn; 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; inum; i++)
{
coutarr[i];
coutendl;
}
return;
}
2.冒泡排序
#includestdio.h
int main()
{
int i,j,a[10],t;
for(i=0;i10;i++)
scanf("%d",a[i]);
for(i=0;i10;i++)
for(j=i+1;j10;j++)
if(a[i]a[j])
{
t=a[j];
a[j]=a[i];
a[i]=t;
}
for(i=0;i10;i++)
printf("%d ",a[i]);
return 0;
}
3.堆排序
#includeiostream
using namespace std;
void paidui(int a[20],int i,int m)
{
int k,t;
t=a[i];
k=2*i+1;
while (km)
{
if ((km-1)(a[k]a[k+1]))
k++;
if (ta[k])
{
a[i]=a[k];
i=k;
k=2*i+1;
}
else break;
}
a[i]=t;
}
void duipai(int a[20], int n)
{
int i,k;
for (i=n/2-1;i=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;i10;i++)
cina[i];
duipai(a,10);
for(i=0;i10;i++)
couta[i]endl;
}
4.快速排序
#includeiostream
using 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(firstlast)
{
while(firstlasta[last]=key)
--last;
a[first]=a[last];
while(firstlasta[first]=key)
++first;
a[last]=a[first];
}
a[first]=key;
Quicksort(a,low,first-1);
Quicksort(a,last+1,high);
}
int main()
{
int i,a[100],x,n=0;
while(cinx)
{
a[n]=x;
n++;
}
n--;
Quicksort(a,0,n);
for(i=0;i=n;i++)
couta[i]" ";
coutendl;
return 0;
}
5. 基数排序
#include stdio.h
#include stdlib.h
int main(){
int data[10]={73,22,93,43,55,14,82,65,39,81}; //对十个数进行排序
int temp[10][10]={0}; //构造一个临时二维数组,其值为0
int order[10]={0}; //构造一维数组,其值为0
int i,j,k,n,lsd;
k=0;n=1;
for (i=0;i10;i++) printf("%d ",data[i]); //在排序前,对这10个数打印一遍
putchar('\n');
while (n=10){
for (i=0;i10;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("\n重新排列: ");
for (i=0;i10;i++){
if(order[i]!=0)
for (j=0;jorder[i];j++){
data[k]=temp[i][j];
printf("%d ",data[k]);
k++;
}
order[i]=0;
}
n*=10; //第二次用十位
k=0;
}
putchar('\n');
printf("\n排序后: ");
for (i=0;i10;i++) printf("%d ",data[i]);
return 0;
}
6.希尔排序
#includeiostream
using namespace std;
void shell_sort(int a[],int n);
int main()
{
int n,a[10000];
cinn;
for(int y=0;yn;y++)
cina[y];
shell_sort(a, n);
for(int i=0; in; i++)
couta[i]" ";
coutendl;
}
void shell_sort(int a[], int n)
{
int gap,k,temp;//定义增量c语言的排序函数有多少种;
for(gap = 3; gap 0; gap--)//设置初始增量,递减c语言的排序函数有多少种;
{
for(int i=0; igap; i++)//按增量分组;
{
for(int j = i+gap; jn; j=j+gap)//每组分别比较大小;
{
if(a[j]a[j-gap])
{
temp = a[j];
k = j-gap;
while(k=0a[k]temp)
{
a[k+gap] = a[k];
k = k-gap;
}
a[k+gap] = temp;
}
}
}
}
}
7.归并排序
#includeiostream
using 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=mj=t)
{
if(p[i]=p[j])
q[k++]=p[i++];
else
q[k++]=p[j++];
}
if(i=m)
while(i=m)
q[k++]=p[i++];
else while(j=t)
q[k++]=p[j++];
for(int n=s;n=t;n++)
p[n]=q[n];
}
void Merge(int p[],int s,int t)
{
if(st)
{
int m=(s+t)/2; //将数组分成两半
Merge(p,s,m);//递归拆分左数组
Merge(p,m+1,t);//递归拆分右数组
MergeSort(p,s,m,t);//合并数组
}
}
int main()
{
int n;
int p[100];
cinn;
for(int i=0; in; i++)
cinp[i];
Merge(p,0,n-1);
for(int j=0;jn;j++)
coutp[j]" ";
coutendl;
return 0;
}
排序方法基本就这些,还有双向冒泡这种拓展的排序方法,还有直接排序如桶排序
相关问答
Q1: C语言中的排序函数是什么
include cstdlib 或 #include stdlib.h
qsort(void* base, size_t num, size_t width, int(*)compare(const void* elem1, const void* elem2))
参数表
*base: 待排序的元素(数组,下标0起)。
num: 元素的数量。
width: 每个元素的内存空间大小(以字节为单位)。可用sizeof()测得。
int(*)compare: 指向一个比较函数。*elem1 *elem2: 指向待比较的数据。
比较函数的返回值
返回值是int类型,确定elem1与elem2的相对位置。
elem1在elem2右侧返回正数,elem1在elem2左侧返回负数。
控制返回值可以确定升序/降序。
产生随机数的函数也是rand(),不是rank().
Q2: C语言常用的函数有哪些
C语言库函数,常用库函数有:
1、scanf格式输入函数
2、printf格式输出函数
3、systemdos命令函数
4、sort排序
5、main主函数
6、fgets文件读取字符串函数
7、fputs文件写入字符串函数
8、fscanf文件格式读取函数
9、fprintf文件格式写入函数
10、fopen打开文件函数
11、getchar输入字符函数
12、putchar输出字符函数
13、malloc动态申请内存函数
14、free释放内存函数
15、abs求绝对值数学函数
16、sqrt求平方根数学函数
扩展资料
语言组成:
1、数据类型
C的数据类型包括:整型、字符型、实型或浮点型(单精度和双精度)、枚举类型、数组类型、结构体类型、共用体类型、指针类型和空类型。
2、常量与变量
常量其值不可改变,符号常量名通常用大写。
变量是以某标识符为名字,其值可以改变的量。标识符是以字母或下划线开头的一串由字母、数字或下划线构成的序列,请注意第一个字符必须为字母或下划线,否则为不合法的变量名。变量在编译时为其分配相应存储单元。
3、数组
如果一个变量名后面跟着一个有数字的中括号,这个声明就是数组声明。字符串也是一种数组。它们以ASCII的NULL作为数组的结束。要特别注意的是,方括内的索引值是从0算起的。
4、指针
如果一个变量声明时在前面使用 * 号,表明这是个指针型变量。换句话说,该变量存储一个地址,而 *(此处特指单目运算符 * ,下同。C语言中另有 双目运算符 *) 则是取内容操作符,意思是取这个内存地址里存储的内容。指针是 C 语言区别于其他同时代高级语言的主要特征之一。
参考资料来源:百度百科-函数
Q3: C语言实现七种排序算法的演示代码是什么?
(1)“冒泡法” \x0d\x0a\x0d\x0a冒泡法大家都较熟悉。其原理为从a[0]开始c语言的排序函数有多少种,依次将其和后面的元素比较,若a[0]a[i],则交换它们,一直比较到a[n]。同理对a[1],a[2],...a[n-1]处理,即完成排序。下面列出其代码:\x0d\x0a\x0d\x0avoid bubble(int *a,int n) /*定义两个参数:数组首地址与数组大小*/ \x0d\x0a\x0d\x0a{ \x0d\x0a\x0d\x0aint i,j,temp; \x0d\x0a\x0d\x0afor(i=0;ia[j]) { \x0d\x0a\x0d\x0atemp=a[i]; \x0d\x0a\x0d\x0aa[i]=a[j]; \x0d\x0a\x0d\x0aa[j]=temp; \x0d\x0a\x0d\x0a} \x0d\x0a\x0d\x0a} \x0d\x0a\x0d\x0a冒泡法原理简单,但其缺点是交换次数多,效率低。 \x0d\x0a\x0d\x0a下面介绍一种源自冒泡法但更有效率的方法“选择法”。 \x0d\x0a\x0d\x0a(2)“选择法” \x0d\x0a\x0d\x0a选择法循环过程与冒泡法一致,它还定义c语言的排序函数有多少种了记号k=i,然后依次把a[k]同后面元素比较,若a[k]a[j],则使k=j.最后看看k=i是否还成立,不成立则交换a[k],a[i],这样就比冒泡法省下许多无用的交换,提高了效率。\x0d\x0a\x0d\x0avoid choise(int *a,int n) \x0d\x0a\x0d\x0a{ \x0d\x0a\x0d\x0aint i,j,k,temp; \x0d\x0a\x0d\x0afor(i=0;ia[j]) k=j; /*是k总是指向最小元素*/ \x0d\x0a\x0d\x0aif(i!=k) { /*当k!=i是才交换,否则a[i]即为最小*/ \x0d\x0a\x0d\x0atemp=a[i]; \x0d\x0a\x0d\x0aa[i]=a[k]; \x0d\x0a\x0d\x0aa[k]=temp; \x0d\x0a\x0d\x0a} \x0d\x0a\x0d\x0a} \x0d\x0a\x0d\x0a} \x0d\x0a\x0d\x0a选择法比冒泡法效率更高,但说到高效率,非“快速法”莫属,现在就让我们来了解它。 \x0d\x0a\x0d\x0a(3)“快速法” \x0d\x0a\x0d\x0a快速法定义了三个参数,(数组首地址*a,要排序数组起始元素下标i,要排序数组结束元素下标j). 它首先选一个数组元素(一般为a[(i+j)/2],即中间元素)作为参照,把比它小的元素放到它的左边,比它大的放在右边。然后运用递归,在将它左,右两个子数组排序,最后完成整个数组的排序。下面分析其代码:\x0d\x0a\x0d\x0avoid quick(int *a,int i,int j) \x0d\x0a\x0d\x0a{ \x0d\x0a\x0d\x0aint m,n,temp; \x0d\x0a\x0d\x0aint k; \x0d\x0a\x0d\x0am=i; \x0d\x0a\x0d\x0an=j; \x0d\x0a\x0d\x0ak=a[(i+j)/2]; /*选取的参照*/ \x0d\x0a\x0d\x0ado { \x0d\x0a\x0d\x0awhile(a[m]kni) n--; /* 从右到左找比k小的元素*/ \x0d\x0a\x0d\x0aif(mi) quick(a,i,n); \x0d\x0a\x0d\x0a} \x0d\x0a\x0d\x0a(4)“插入法” \x0d\x0a\x0d\x0a插入法是一种比较直观的排序方法。它首先把数组头两个元素排好序,再依次把后面的元素插入适当的位置。把数组元素插完也就完成了排序。\x0d\x0a\x0d\x0avoid insert(int *a,int n) \x0d\x0a\x0d\x0a{ \x0d\x0a\x0d\x0aint i,j,temp; \x0d\x0a\x0d\x0afor(i=1;i=0temp=1)的那几个元素排好序,再缩小k值(一般取其一半),再排序,直到k=1时完成排序。下面让我们来分析其代码:\x0d\x0a\x0d\x0avoid shell(int *a,int n) \x0d\x0a\x0d\x0a{ \x0d\x0a\x0d\x0aint i,j,k,x; \x0d\x0a\x0d\x0ak=n/2; /*间距值*/ \x0d\x0a\x0d\x0awhile(k=1) { \x0d\x0a\x0d\x0afor(i=k;i=0x \x0d\x0a\x0d\x0a/*别偷懒,下面的"..."代表函数体,自己加上去哦c语言的排序函数有多少种!*/ \x0d\x0a\x0d\x0avoid bubble(int *a,int n) \x0d\x0a\x0d\x0a{ \x0d\x0a\x0d\x0a... \x0d\x0a\x0d\x0a} \x0d\x0a\x0d\x0avoid choise(int *a,int n) \x0d\x0a\x0d\x0a{ \x0d\x0a\x0d\x0a... \x0d\x0a\x0d\x0a} \x0d\x0a\x0d\x0avoid quick(int *a,int i,int j) \x0d\x0a\x0d\x0a{ \x0d\x0a\x0d\x0a... \x0d\x0a\x0d\x0a} \x0d\x0a\x0d\x0avoid insert(int *a,int n) \x0d\x0a\x0d\x0a{ \x0d\x0a\x0d\x0a... \x0d\x0a\x0d\x0a} \x0d\x0a\x0d\x0avoid shell(int *a,int n) \x0d\x0a\x0d\x0a{ \x0d\x0a\x0d\x0a... \x0d\x0a\x0d\x0a} \x0d\x0a\x0d\x0a/*为了打印方便,我们写一个print吧。*/[code]\x0d\x0a\x0d\x0avoid print(int *a,int n) \x0d\x0a\x0d\x0a{ \x0d\x0a\x0d\x0aint i; \x0d\x0a\x0d\x0afor(i=0;i
回答于 2022-12-14
Q4: c语言的两种排序?
1、选择排序法
要求输入10个整数,从大到小排序输出
输入:2 0 3 -4 8 9 5 1 7 6
输出:9 8 7 6 5 3 2 1 0 -4
代码:
#includelt;stdio.hgt;
int main(int argc,const char*argv[]){
int num[10],i,j,k,l,temp;
//用一个数组保存输入的数据
for(i=0;ilt;=9;i++)
{
scanf("%d",numlt;igt;);
}
//用两个for嵌套循环来进行数据大小比较进行排序
for(j=0;jlt;9;j++)
{
for(k=j+1;klt;=9;k++)
{
if(num[j]lt;num[k])//num[j]lt;num[k]
{
temp=num[j];
num[j]=num[k];
num[k]=temp;
}
}
}
//用一个for循环来输出数组中排序好的数据
for(l=0;llt;=9;l++)
{
printf("%d",num[l]);
}
return 0;
}
2、冒泡排序法
要求输入10个整数,从大到小排序输出
输入:2 0 3-4 8 9 5 1 7 6
输出:9 8 7 6 5 3 2 1 0-4
代码:
#includelt;stdio.hgt;
int main(int argc,const char*argv[]){
//用一个数组来存数据
int num[10],i,j,k,l,temp;
//用for来把数据一个一个读取进来
for(i=0;ilt;=9;i++)
{
scanf("%d",numlt;igt;);
}
//用两次层for循环来比较数据,进行冒泡
for(j=0;jlt;9;j++)
{
for(k=0;klt;9-j;k++)
{
if(num[k]lt;num[k+1])//num[k]lt;num[k+1]
{
temp=num[k];
num[k]=num[k+1];
num[k+1]=temp;
}
}
}
//用一个for循环来输出数组中排序好的数据
for(l=0;llt;=9;l++)
{
printf("%d",num[l]);
}
return 0;
}
扩展资料:
return 0代表程序正常退出。return是C++预定义的语句,它提供了终止函数执行的一种方式。当return语句提供了一个值时,这个值就成为函数的返回值。
return语句用来结束循环,或返回一个函数的值。
1、return 0,说明程序正常退出,返回到主程序继续往下执行。
2、return 1,说明程序异常退出,返回主调函数来处理,继续往下执行。return 0或return 1对程序执行的顺序没有影响,只是大家习惯于使用return(0)退出子程序而已。
c语言的排序函数有多少种的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c语言排序总结、c语言的排序函数有多少种的信息别忘了在本站进行查找喔。





