关于c语言排序问题

作者&投稿:堵福 (若有异议请与网页底部的电邮联系)
C语言排序问题~

这几个if语句是独立的,互相没有关系;但后面的if中用的变量值是前面的if语句操作以后的值。
第二张图片的中最后的if(x<y)...是没有必要的。3个变量,两两比较过就可以了。

不一样。打擂台是每次比出一个最大的拿掉,剩下的接着比,最大的第一个被确定;
冒泡则是每次只交换相邻的,直到顺序正确,如果最大的排在末尾,可能要经过很多很多次循环才能交换到队首。

排 序:
程序员可以使用的基本排序算法有5种:
·插入排序(insertionsort.)
·交换排序(exchangesOrt)
·选择排序(selectionsort)
·归并排序(mergesort)
·分布排序(distributionsort)

为了形象地解释每种排序算法是怎样工作的,让我们来看一看怎样用这些方法对桌上一付乱序的牌进行排序。牌既要按花色排序(依次为梅花、方块、红桃和黑心),还要按点数排序(从2到A)。
插入排序的过程为:从一堆牌的上面开始拿牌,每次拿一张牌,按排序原则把牌放到手中正确的位置。桌上的牌拿完后,手中的牌也就排好序了。
交换排序的过程为:
(1)先拿两张牌放到手中。如果左边的牌要排在右边的牌的后面,就交换这两张牌的位置。
(2)然后拿下一张牌,并比较最右边两张牌,如果有必要就交换这两张牌的位置。
(3)重复第(2)步,直到把所有的牌都拿到手中。
(4)如果不再需要交换手中任何两张牌的位置,就说明牌已经排好序了;否则,把手中的牌放到桌上,重复(1)至(4)步,直到手中的牌排好序。
选择排序的过程为:在桌上的牌中找出最小的一张牌,拿在手中;重复这种操作,直到把所有牌都拿在手中。
归并排序的过程为:把桌上的牌分为52堆,每堆为一张牌。因为每堆牌都是有序的(记住,此时每堆中只有一张牌),所以如果把相邻的两堆牌合并为一堆,并对每堆牌进行排序,就可以得到26堆已排好序的牌,此时每一堆中有两张牌。重复这种合并操作,就可以依次得到13堆牌(每一堆中有4张牌),7堆牌(有6堆是8张牌,还有一堆是4张牌),最后将得到52张的一堆牌。
分布排序(也被称作radix sort,即基数排序)的过程为:先将牌按点数分成13堆,然后将这13堆牌按点数顺序叠在一起;再将牌按花色分成4堆,然后将这4堆牌按花色顺序叠在一起,牌就排好序了。
在选用排序算法时,你还需要了解以下几个术语:
(1)自然的(natural)
如果某种排序算法对有序的数据排序速度较快(工作量变小),对无序的数据排序速度却较慢(工作变量大),我们就称这种排序算法是自然的。如果数据已接近有序,就需要考虑选用自然的排序算法。
(2)稳定的(stable)
如果某种排序算法能保持它认为相等的数据的前后顺序,我们就称这种排序算法是稳定的。
例如,现有以下名单:
Mary Jones
Mary Smith
Tom Jones
Susie Queue
如果用稳定的排序算法按姓对上述名单进行排序,那么在排好序后"Mary Jones”和"Tom Jones”将保持原来的Jr顺序,因为它们的姓是相同的。
稳定的排序算法可按主、次关键字对数据进行排序,例如按姓和名排序(换句话说,主要按姓排序,但对姓相同的数据还要按名排序)。在具体实现时,就是先按次关键字排序,再按主关键字排序。
(3)内部排序(internal sort)和外部排序(external sort)
待排数据全部在内存中的排序方法被称为内部排序,待排数据在磁盘、磁带和其它外存中的排序方法被称为外部排序。

查 找:
和排序算法一样,查找(searching)算法也是计算机科学中研究得最多的问题之一。查找算法和排序算法是有联系的,因为许多查找算法依赖于要查找的数据集的有序程度。基本的查找算法有以下4种:
·顺序查找(sequential searching)。
·比较查找(comparison searching)
·基数查找(radix searching)
·哈希查找(hashing)
下面仍然以一付乱序的牌为例来描述这些算法的工作过程。
顺序查找的过程为:从第一张开始查看每一张牌,直到找到要找的牌。
比较查找(也被称作binarysearching,即折半查找)要求牌已经排好序,其过程为:任意抽一张牌,如果这张牌正是要找的牌,则查找过程结束。如果抽出的这张牌比要找的牌大,则在它前面的牌中重复查找操作;反之,则在它后面的牌中重复查找操作,直到找到要找的牌。
基数查找的过程为:先将牌按点数分成13堆,或者按花色分成4堆。然后找出与要找的牌的点数或花色相同的那一堆牌,再在这堆牌中用任意一种查找算法找到要找的牌。
哈希查找的过程为:
(1)在桌面上留出可以放若干堆牌的空间,并构造一个函数,使其能根据点数和花色将牌映射到特定的堆中(这个函数被称为hashfunction,即哈希函数)。
(2)根据哈希函数将牌分成若干堆。
(3)根据哈希函数找到要找的牌所在的堆,然后在这一堆牌中找到要找的牌。
例如,可以构造这样一个哈希函数:
pile=rank+suit
其中,rank是表示牌的点数的一个数值;suit是表示牌的花色的一个数值;pile表示堆值,它将决定一张牌归入到哪一堆中。如果用1,2,……,13分别表示A,2,…….K,用0,1,2和3分别表示梅花、方块、红桃和黑桃,则pile的值将为1,2,……,16,这样就可以把一付牌分成16堆。
哈希查找虽然看上去有些离谱,但它确实是一种非常实用的查找算法。各种各样的程序,从压缩程序(如Stacker)到磁盘高速缓存程序(如SmartDrive),几乎都通过这种方法来提高查找速度,

排序或查找的性能:
有关排序和查找的一个主要问题就是速度。这个问题经常被人们忽视,因为与程序的其余部分相比,排序或查找所花费的时间几乎可以被忽略。然而,对大多数排序或查找应用来说,你不必一开始就花很多精力去编制一段算法程序,而应该先在现成的算法中选用一种最简单的(见3.1和3.4),当你发现所用的算法使程序运行很慢时,再换用一种更好的算法(请参见下文中的介绍)。
下面介绍一种判断排序或查找算法的速度的方法。
首先,引入一个算法的复杂度的概念,它指的是在各种情况(最好的、最差的和平均的)下排序或查找需要完成的操作次数,通过它可以比较不同算法的性能。
算法的复杂度与排序或查找所针对的数据集的数据量有关,因此,引入一个基于数据集数据量的表达式来表示算法的复杂度。
最快的算法的复杂度O(1),它表示算法的操作次数与数据量无关。复杂度O(N)(N表示数据集的数据量)表示算法的操作次数与数据量直接相关。复杂度O(logN)介于上述两者之间,它表示算法的操作次数与数据量的对数有关。复杂度为O(NlogN)(N乘以logN)的算法比复杂度为O(N)的算法要慢,而复杂度为O(N2)的算法更慢。
注意:如果两种算法的复杂度都是O(logN),那么logN的基数较大的算法的速度要快些,在本章的例子中,logN的基数均为10

#include
<stdio.h>
#include
<stdlib.h>
main()
{

int
a,b,c,t;

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

if(a>b)

{t=a;a=b;b=t;}

if(a>c)

{t=a;a=c;c=t;}

if(b>c)

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

printf("%d%d%d",a,b,c);

system("pause");

}

void
main()
{...}

没有错啊!你运行的时候是哪里出错!


C语言编程题:扑克牌排序问题
2015-03-09 C语言编程题:扑克牌排序问题 2 2010-05-11 c语言编程用扑克牌洗牌和发牌 40 2013-10-14 c语言 扑克牌问题 请解答 2015-12-09 C语言考试题大神求代码啊!!!用随机数生成器列出所有扑克牌... 2009-02-22 用C语言编程扑克牌搓点游戏,急! 9 2014-12-19 用简单c语言,随机输出17张扑克...

C语言 简单的从大到小排序问题
这是冒泡排序法。第一个循环的控制变量应该是 i < N - 1 ,也就是 两两比较的 前一个数 最多只到 倒数第二个;而 第二个 循环的控制变量应该是 j < N ,表示 两两比较的后一个数, 要直到最后一个数。如有帮助,烦请点采纳,谢谢!

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 ...

如何用c语言编写一个程序,实现按从大到小的顺序排序输出10个数_百度知...
用选择排序法编写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...

c语言冒泡排序法代码一直排序错误,有时只能排前两个,不明白原因,请问究 ...
printf("请输入数的个数:"); scanf("%d",&n); \/\/获取数列元素个数 for(i=0;i<n;i++){ scanf("%d",&num[i]); \/\/获取数列每个元素的值 } \/\/冒泡排序算法 for(j=0;j<n-1;j++) \/\/外层循环,控制排序次数 { for(i=0;i<n-1-j;i++) \/\/内层循环...

C语言中三个数排序
用C语言编写通过if将3个数排序:include<stdio.h>\/*函数头:输入输出头文件*\/ void main()\/*空类型:主函数*\/ { inta,b,c,t;\/*定义变量的数据类型为整型*\/ printf("输入3个数,中间用空格隔开:");\/*输出文字提示*\/ scanf("%d%d%d",&a,&b,&c);\/*输入3个数字*\/ if(a<b)\/*判断...

c语言问题,用选择法排序
选择法的算法:假设需要对10个数进行排序,那么首先找出10个数里面的最小数,并和这个10个数的第一个(下标0)交换位置,剩下9个数(这9个数都比刚才选出来那个数大),再选出这9个数中的最小的数,和第二个位置的数(下标1)交换,于是还剩8个数(这8个数都比刚才选出来的大)..依次类推...

求C语言将数组元素大小排序!!
C语言将数组元素大小排序方法:以下使用的是冒泡排序法实线数组从小到大排序。思想:每次相邻两个数比较,若升序,则将大的数放到后面,一次循环过后,就会将最大的数放在最后。10、2、3、4、5、6、9、8、7、1是输入的待排序的数列,经过第一次排序,将最大的,10放在最后,第二次排序,将剩下的...

C语言中将三个数字进行排序的几种写法
if(a<c)\/\/如果a比c小,交换a和c的值,使a存放大的数字 { tmp=a;a=c;c=tmp;} if(b<c)\/\/如果b比c小,交换b和c的值,使b存放大的数字 { tmp=b;b=c;c=tmp;} printf("按照从大到小的顺序为:%d,%d,%d\\n",a,b,c);方法2:用数组存放3个变量,用冒泡排序的方法进行排序int ...

C语言题:对A,B,C三个整数按照从大到小的方法进行排序
include <stdio.h>int main(void){ int a, b, c; printf("请输入三个数:"); scanf("%d%d%d", &a, &b, &c); if (a < b) { int c; c = a; a = b; b = c; } if(b < c) { int a; a = b; b = c; c = b...

湘西土家族苗族自治州17628667469: C语言排序的方法 -
况曹孕康: 现在流行的排序有:直接插入排序、冒泡排序、简单选择排序、希尔排序、快速排序、堆排序、归并排序、基数排序.对n个记录进行选择排序的方法是:通过n-i次关键字之间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1<=i<=n)...

湘西土家族苗族自治州17628667469: 关于c语言排序问题 -
况曹孕康: 排 序:程序员可以使用的基本排序算法有5种:·插入排序(insertionsort.)·交换排序(exchangesOrt)·选择排序(selectionsort)·归并排序(mergesort)·分布排序(distributionsort) 为了形象地解释每种排序算法是怎样工作的...

湘西土家族苗族自治州17628667469: c语言字符串排序问题! -
况曹孕康: 不用字符串函数. 本题的一个完整的c程序如下,程序在win-tc和Dev-c++下都调试通过. #include<stdio.h> #include<stdlib.h> #include<conio.h> #define N 3/* 设定要输入的字符串个数,可更改 */int cmp(char *p1,char *p2) /* 字符串比较函数 */ ...

湘西土家族苗族自治州17628667469: C语言中的排序法 -
况曹孕康: c语言中排序法有选择法和冒泡法是最常见的. 1冒泡法对10个数排序 #include<stdio.h> voidmain() {inta[10]; inti,j,t; printf("pleaseinput10numbers:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); printf("\n"); for(j=0;j<9;j++)//进行9次循环,实现9次...

湘西土家族苗族自治州17628667469: c语言数字排序问题 -
况曹孕康: 展开全部// 正好适合插入排序 有问题联系#include#define ARR_SIZE 10 int main() { int i,j,arr[ARR_SIZE]; int temp; for (i=0;i { scanf("%d",&temp); if (i==0) { arr[0]=temp; }else { j=i-1; while (j>=0&&arr[j]>temp) { arr[j+1]=arr[j]; --j; } arr[j+1]=temp; } for ( j=0;j<=i;++j) { printf("%d\t",arr[j]); } printf("\n"); } return 0; }

湘西土家族苗族自治州17628667469: c语言排序题 -
况曹孕康: 前提,我是以-1作为结束标记的,做了个简单的,你看看吧,排序还有很多方法,C语言书上有,我只用了最简单的一种. #include void main() { float chengji[100]; //存放成绩 int i = 0; //循环控制 int j = 0; //循环控制 int k = 0; //循环控制 float ...

湘西土家族苗族自治州17628667469: C语言数据排序 -
况曹孕康: /*选择排序法:从小到大排列10个数并输出*/#include<stdio.h>#define N 10 //可修改输入个数 void main() { int i,a[N],t,j; for(i=0;i<N;i++) scanf("%d",&a[i]); //输入 for(j=1;j<N;j++) //N次比较 for(i=0;i<j;i++) //每趟中比j次if(a[i]>a[j]) //与a[i]后面的元素进行比较 { t=a[i];a[i]=a[j];a[j]=t; } printf("排序后:\n"); for(i=0;i<N;i++) printf("%d ",a[i]); printf("\n"); }

湘西土家族苗族自治州17628667469: C语言的排序问题 -
况曹孕康: 有内循环和外循环构成 将下标为i和j的2组数据数值进行比较 也就是将aa[i] aa[j]进行循环比较如果下标为i的数据数值大于下标为j的数据数值则执行IF语句 将aa[i]与aa[j]进行对换 T为中间变量 仅供参考

湘西土家族苗族自治州17628667469: c语言简单的排序问题 -
况曹孕康: #include#include#include#define SWAP(x,y) {int t;t=x;x=y;y=t;}#define MAX 10 void sort(int number[],int left,int right); int quicksort(int number[],int left,int right); int main(){ int number[MAX],i; srand(time(0)); for(i=0;i number[i]=(int)rand()%100; } ...

湘西土家族苗族自治州17628667469: 关于C语言的数据排序! -
况曹孕康: do……while这种循环的条件是:只要while后面的语句的值为true它就一直执行,直到值变为false才停止循环.因此本题的while(n<MAX)就表示只要n小于MAX该循环就一直进行,直到n大于等于MAX 你说的“直到n<MAX”其实理解错误了,应该是“直到n>=MAX”

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