当前位置:首页 » 编程语言 » c语言中怎么令数从大到小排列
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言中怎么令数从大到小排列

发布时间: 2022-09-05 18:53:51

1. 怎样用c语言对一串整行数从大到小排序

方法太多了,当然各种时间排序的时间复杂度和空间复杂度不同、稳定性也不同。最简单的我觉得就是冒泡排序了,也最形像。/*
================================================
功能:选择排序
输入:数组名称(也就是数组首地址)、数组中元素个数
================================================
*/
/*
====================================================
算法思想简单描述: 在要排序的一组数中,选出最小的一个数与第一个位置的数交换;
然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环
到倒数第二个数和最后一个数比较为止。 选择排序是不稳定的。算法复杂度O(n2)--[n的平方]
=====================================================
*/
void select_sort(int *x, int n)
{
int i, j, min, t; for (i=0; i<n-1; i++) /*要选择的次数:0~n-2共n-1次*/
{
min = i; /*假设当前下标为i的数最小,比较后再调整*/
for (j=i+1; j<n; j++)/*循环找出最小的数的下标是哪个*/
{
if (*(x+j) < *(x+min))
{
min = j; /*如果后面的数比前面的小,则记下它的下标*/
}
}

if (min != i) /*如果min在循环中改变了,就需要交换数据*/
{
t = *(x+i);
*(x+i) = *(x+min);
*(x+min) = t;
}
}
}
/*
================================================
功能:直接插入排序
输入:数组名称(也就是数组首地址)、数组中元素个数
================================================
*/
/*
====================================================
算法思想简单描述: 在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排
好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数
也是排好顺序的。如此反复循环,直到全部排好顺序。

直接插入排序是稳定的。算法时间复杂度O(n2)--[n的平方]
=====================================================
*/
void insert_sort(int *x, int n)
{
int i, j, t; for (i=1; i<n; i++) /*要选择的次数:1~n-1共n-1次*/
{
/*
暂存下标为i的数。注意:下标从1开始,原因就是开始时
第一个数即下标为0的数,前面没有任何数,单单一个,认为
它是排好顺序的。
*/
t=*(x+i);
for (j=i-1; j>=0 && t<*(x+j); j--) /*注意:j=i-1,j--,这里就是下标为i的数,在它前面有序列中找插入位置。*/
{
*(x+j+1) = *(x+j); /*如果满足条件就往后挪。最坏的情况就是t比下标为0的数都小,它要放在最前面,j==-1,退出循环*/
} *(x+j+1) = t; /*找到下标为i的数的放置位置*/
}
}
/*
================================================
功能:冒泡排序
输入:数组名称(也就是数组首地址)、数组中元素个数
================================================
*/
/*
====================================================
算法思想简单描述: 在要排序的一组数中,对当前还未排好序的范围内的全部数,自上
而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较
小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要
求相反时,就将它们互换。

下面是一种改进的冒泡算法,它记录了每一遍扫描后最后下沉数的
位置k,这样可以减少外层循环扫描的次数。 冒泡排序是稳定的。算法时间复杂度O(n2)--[n的平方]
=====================================================
*/void bubble_sort(int *x, int n)
{
int j, k, h, t;

for (h=n-1; h>0; h=k) /*循环到没有比较范围*/
{
for (j=0, k=0; j<h; j++) /*每次预置k=0,循环扫描后更新k*/
{
if (*(x+j) > *(x+j+1)) /*大的放在后面,小的放到前面*/
{
t = *(x+j);
*(x+j) = *(x+j+1);
*(x+j+1) = t; /*完成交换*/
k = j; /*保存最后下沉的位置。这样k后面的都是排序排好了的。*/
}
}
}
}
/*
================================================
功能:希尔排序
输入:数组名称(也就是数组首地址)、数组中元素个数
================================================
*/
/*
====================================================
算法思想简单描述:

在直接插入排序算法中,每次插入一个数,使有序序列只增加1个节点,
并且对插入下一个数没有提供任何帮助。如果比较相隔较远距离(称为
增量)的数,使得数移动时能跨过多个元素,则进行一次比较就可能消除
多个元素交换。D.L.shell于1959年在以他名字命名的排序算法中实现
了这一思想。算法先将要排序的一组数按某个增量d分成若干组,每组中
记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量
对它进行,在每组中再进行排序。当增量减到1时,整个要排序的数被分成
一组,排序完成。

下面的函数是一个希尔排序算法的一个实现,初次取序列的一半为增量,
以后每次减半,直到增量为1。 希尔排序是不稳定的。
=====================================================
*/
void shell_sort(int *x, int n)
{
int h, j, k, t; for (h=n/2; h>0; h=h/2) /*控制增量*/
{
for (j=h; j<n; j++) /*这个实际上就是上面的直接插入排序*/
{
t = *(x+j);
for (k=j-h; (k>=0 && t<*(x+k)); k-=h)
{
*(x+k+h) = *(x+k);
}
*(x+k+h) = t;
}
}
}/*
================================================
功能:快速排序
输入:数组名称(也就是数组首地址)、数组中起止元素的下标
================================================
*/
/*
====================================================
算法思想简单描述: 快速排序是对冒泡排序的一种本质改进。它的基本思想是通过一趟
扫描后,使得排序序列的长度能大幅度地减少。在冒泡排序中,一次
扫描只能确保最大数值的数移到正确位置,而待排序序列的长度可能只
减少1。快速排序通过一趟扫描,就能确保某个数(以它为基准点吧)
的左边各数都比它小,右边各数都比它大。然后又用同样的方法处理
它左右两边的数,直到基准点的左右只有一个元素为止。它是由
C.A.R.Hoare于1962年提出的。

显然快速排序可以用递归实现,当然也可以用栈化解递归实现。下面的
函数是用递归实现的,有兴趣的朋友可以改成非递归的。 快速排序是不稳定的。最理想情况算法时间复杂度O(nlog2n),最坏O(n2)

=====================================================
*/
void quick_sort(int *x, int low, int high)
{
int i, j, t; if (low < high) /*要排序的元素起止下标,保证小的放在左边,大的放在右边。这里以下标为low的元素为基准点*/
{
i = low;
j = high;
t = *(x+low); /*暂存基准点的数*/ while (i<j) /*循环扫描*/
{
while (i<j && *(x+j)>t) /*在右边的只要比基准点大仍放在右边*/
{
j--; /*前移一个位置*/
} if (i<j)
{
*(x+i) = *(x+j); /*上面的循环退出:即出现比基准点小的数,替换基准点的数*/
i++; /*后移一个位置,并以此为基准点*/
} while (i<j && *(x+i)<=t) /*在左边的只要小于等于基准点仍放在左边*/
{
i++; /*后移一个位置*/
} if (i<j)
{
*(x+j) = *(x+i); /*上面的循环退出:即出现比基准点大的数,放到右边*/
j--; /*前移一个位置*/
}
} *(x+i) = t; /*一遍扫描完后,放到适当位置*/
quick_sort(x,low,i-1); /*对基准点左边的数再执行快速排序*/
quick_sort(x,i+1,high); /*对基准点右边的数再执行快速排序*/
}
}
/*
================================================
功能:堆排序
输入:数组名称(也就是数组首地址)、数组中元素个数
================================================
*/
/*
====================================================
算法思想简单描述: 堆排序是一种树形选择排序,是对直接选择排序的有效改进。
堆的定义如下:具有n个元素的序列(h1,h2,...,hn),当且仅当
满足(hi>=h2i,hi>=2i+1)或(hi<=h2i,hi<=2i+1)(i=1,2,...,n/2)
时称之为堆。在这里只讨论满足前者条件的堆。 由堆的定义可以看出,堆顶元素(即第一个元素)必为最大项。完全二叉树可以
很直观地表示堆的结构。堆顶为根,其它为左子树、右子树。
初始时把要排序的数的序列看作是一棵顺序存储的二叉树,调整它们的存储顺序,
使之成为一个堆,这时堆的根节点的数最大。然后将根节点与堆的最后一个节点
交换。然后对前面(n-1)个数重新调整使之成为堆。依此类推,直到只有两个节点
的堆,并对它们作交换,最后得到有n个节点的有序序列。 从算法描述来看,堆排序需要两个过程,一是建立堆,二是堆顶与堆的最后一个元素
交换位置。所以堆排序有两个函数组成。一是建堆的渗透函数,二是反复调用渗透函数
实现排序的函数。 堆排序是不稳定的。算法时间复杂度O(nlog2n)。*/
/*
功能:渗透建堆
输入:数组名称(也就是数组首地址)、参与建堆元素的个数、从第几个元素开始
*/
void sift(int *x, int n, int s)
{
int t, k, j; t = *(x+s); /*暂存开始元素*/
k = s; /*开始元素下标*/
j = 2*k + 1; /*右子树元素下标*/ while (j<n)
{
if (j<n-1 && *(x+j) < *(x+j+1))/*判断是否满足堆的条件:满足就继续下一轮比较,否则调整。*/
{
j++;
} if (t<*(x+j)) /*调整*/
{
*(x+k) = *(x+j);
k = j; /*调整后,开始元素也随之调整*/
j = 2*k + 1;
}
else /*没有需要调整了,已经是个堆了,退出循环。*/
{
break;
}
}

*(x+k) = t; /*开始元素放到它正确位置*/
}
/*
功能:堆排序
输入:数组名称(也就是数组首地址)、数组中元素个数
*/
void heap_sort(int *x, int n)
{
int i, k, t;
int *p; for (i=n/2-1; i>=0; i--)
{
sift(x,n,i); /*初始建堆*/
}

for (k=n-1; k>=1; k--)
{
t = *(x+0); /*堆顶放到最后*/
*(x+0) = *(x+k);
*(x+k) = t;
sift(x,k,0); /*剩下的数再建堆*/
}
}
void main()
{
#define MAX 4
int *p, i, a[MAX];

/*录入测试数据*/
p = a;
printf("Input %d number for sorting :\n",MAX);
for (i=0; i<MAX; i++)
{
scanf("%d",p++);
}
printf("\n"); /*测试选择排序*/
p = a;
select_sort(p,MAX);
/**/
/*测试直接插入排序*/ /*
p = a;
insert_sort(p,MAX);
*/
/*测试冒泡排序*/ /*
p = a;
insert_sort(p,MAX);
*/ /*测试快速排序*/ /*
p = a;
quick_sort(p,0,MAX-1);
*/ /*测试堆排序*/ /*
p = a;
heap_sort(p,MAX);
*/ for (p=a, i=0; i<MAX; i++)
{
printf("%d ",*p++);
}

printf("\n");
system("pause");
}

2. C语言四个数由大到小排列

变量t没有初始化就赋值给a,第一个里面应该是t=a 而不是a=t
最好在定义变量的时候就初始化变量,否则就容易出现你说的那种好大的负数

3. C语言怎样给一个数组中的数从大到小排序

#include "stdio.h"
int main()
{
int i,j;
int a[12];
for(i=1; i<=10; ++i)
scanf("%d",&a[i]);

for(i=1; i<10; ++i)
for(j=i; j<=10; ++j)
if(a[i]<a[j])
{
int t=a[i];
a[i]=a[j];
a[j]=t;
}
//前十个数的排序
for(i=1; i<=10; ++i)
printf("%d ",a[i]);
printf("\n");

printf("Input a new number: ");
scanf("%d",&a[11]);
for(i=10; i>0; --i)
if(a[i+1]>a[i])
{
int t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
else break;
//11个数的排序
for(i=1;i<=11; ++i)
printf("%d ",a[i]);
printf("\n");
return 0;
}

4. C语言如何从大到小排序呢

给你提供几个比较简单的算法思路。

首先纠正一下,你要排序的对象不要存在单个变量里,要存在数组里,这样才能用循环的方式取用。

  1. 插入排序

如果你打过牌,这种排序你就一定能理解。从未排序的部分取出一个元素来,然后插入到已经排好序的部分。就这样一个一个的查入。

2.选择排序

从未排序的部分选出最大(最小)的一个放在已排好序的部分的最后。然后重复此步骤。

3.归并排序

排一个很长的序列可能比较麻烦,我就把他们分成两份,把他们分别排好,然后再把他们接起来,接起来就很简单了。而这两个怎么排呢,我再把他们分别分成两个……这就要用到递归了。


总结一下,前两个时间复杂度是平方,后一个是n*logn 。还有很多其他排序方法,其中冒泡排序比较费时但是很好写,如果你不是想知其所以然,直接网络冒泡套用一下就行。

如果想系统的学习算法,推荐你读算法导论,就是那本很厚的。讲的很好。

5. C语言中要把三个数从大到小排列出来应该怎么编

初学简单版本代码如下:

#include<stdio.h>

int main( )

{

int a, b, c;//定义三个数的变量

int t ;//定义作为交换的变量

scanf ( "%d%d%d" , &a, &b, &c ) ; //取值

if ( a < b )

{t = a; a = b; b = t ;};//如果a,b,进行交换,反之不动

if ( a < c )

{t = a; a = c; c = t ;};//同上

if ( b < c )

{t = b; b = c; c = t ;};

printf( "%-5d%-5d%-5d " , a, b, c);//输出

}

(5)c语言中怎么令数从大到小排列扩展阅读:

C语言中其他多个数排序的方法:

1、冒泡排序法

#include <stdio.h>

#define SIZE 8

void bubble_sort(int a[], int n);

void bubble_sort(int a[], int n)

{

int i, j, temp;

for (j = 0; j < n - 1; j++)

for (i = 0; i < n - 1 - j; i++)

{

if(a[i] > a[i + 1])

{

temp = a[i];

a[i] = a[i + 1];

a[i + 1] = temp;

} } }

int main()

{

int number[SIZE] = {95, 45, 15, 78, 84, 51, 24, 12};

int i;

bubble_sort(number, SIZE);

for (i = 0; i < SIZE; i++)

{

printf("%d ", number[i]);

}

}

2、选择排序

#include<stdio.h>

void main()//主函数

{

int a[10];

int i,j,w;

printf("请输入10个数字: ");

for(i=0;i<10;i++)

scanf("%d",&a[i]);

for(i=0;i<10;i++)

{

for(j=i+1;j<10;j++)

if(a[i]<a[j])//进行比较

//比较后进行交换

{

w=a[i];

a[i]=a[j];

a[j]=w;

}

6. c语言编程: 将一组数按从大到小的顺序排序

#include <stdio.h>

main()

{

int x;

printf("请输入要排序数字个数:");

scanf("%d",&x);

int i,j,k,a,b,num[x];

printf("输入数据:");

for(i=0;i<x;i++)

scanf("%d",&num[i]);

for(j=0;j<x;j++)

{

for(k=j+1;k<x;k++)

if(num[k]>num[j])

{

a=num[j];

num[j]=num[k];

num[k]=a;

}

}

for(b=0;b<x;b++)

printf("%d ",num[b]);

return 0;

}

(6)c语言中怎么令数从大到小排列扩展阅读:

include用法:

#include命令预处理命令的一种,预处理命令可以将别的源代码内容插入到所指定的位置;可以标识出只有在特定条件下才会被编译的某一段程序代码;可以定义类似标识符功能的宏,在编译时,预处理器会用别的文本取代该宏。

插入头文件的内容

#include命令告诉预处理器将指定头文件的内容插入到预处理器命令的相应位置。有两种方式可以指定插入头文件:

1、#include<文件名>

2、#include"文件名"

如果需要包含标准库头文件或者实现版本所提供的头文件,应该使用第一种格式。如下例所示:

#include&lt;math.h&gt;//一些数学函数的原型,以及相关的类型和宏

如果需要包含针对程序所开发的源文件,则应该使用第二种格式。

采用#include命令所插入的文件,通常文件扩展名是.h,文件包括函数原型、宏定义和类型定义。只要使用#include命令,这些定义就可被任何源文件使用。

7. C语言如何输入十个数,按从大到小顺序排列!

用选择排序法编写c语言,实现从键盘上输入10个数,按从大到小的顺序排序输出。代码如下:

#include<stdio.h>

int main()

{

int i,j,a[10],t;

printf("输入数");

for (i = 0; i < 10; i++)

scanf("%d",&a[i]);

for (i = 0; i < 10; i++)

{

for (j = i + 1; j < 10;j++)

if (a[i] < a[j]){

t = a[i];

a[i] = a[j];

a[j] = t;

}

}

printf("从大到小");

for (i = 0; i < 10; i++)

printf("%2d", a[i]);

return 0;

}

(7)c语言中怎么令数从大到小排列扩展阅读:

代码还可以设计,如下:

#include<stdio.h>

int main()

{

int a[10],i,j,t;//定义数组;

for(i=0;i<10;i++){

scanf("%d",&a[i]);//给数组赋值;

}

for(i=0;i<9;i++)//10个数,进行9轮比较;

for(j=0;j<10-i;j++){//第一个数比较9次,依次递减;

if(a[j]>a[j+1]) {//交换值;

t=a[j];

a[j]=a[j+1];

a[j+1]=t;

}

}

for(i=0;i<10;i++){

printf("%d ",a[i]);//输出数组的值;

}

return 0;

}

}

printf("the sorted numbers: ");

for(i=0;i<10;i++)

printf(" %d",a[i]);

printf(" ");

}

8. C语言如何用选择法排序任意输入十个数(从大到小、从小到大)

#include
<stdio.h>
main(void)
{
int
i,j,a[10],p=0,t=0,temp;
printf("请输入原数组:\n");
for(j=0;j<10;j++)
scanf("%d",&a[j]);
temp=a[0];
for(j=0;j<9;j++)
{
t=j;
temp=a[j];
for(i=j+1;i<10;i++)
if(temp>a[i])
//这是由小到大排序
如果是大到小则改为
if(temp<a[i])
{temp=a[i];p=i;}
{temp=a[p];a[p]=a[t];a[t]=temp;}
}
printf("排序后的数组为:\n");
for(j=0;j<10;j++)
printf("%d
",a[j]);
}

9. C语言~十个数字从小到大怎么排列~从大到小呢~

//要求任意输入10个数,然后按从小到大顺序输出
#include <stdio.h>
int main()
{
int a[10];
int i,j;
int temp;
printf("请输入10个整数:");
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<9;i++)
{
for(j=0;j<9-i;j++)
{
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
printf("排列后顺序为:");
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
printf(" ");
return 0;
}