c语言排序

C\u8bed\u8a00\u6392\u5e8f

\u4e0b\u9762\u662f\u4f7f\u7528\u5192\u6ce1\u6392\u5e8f\u7684\u7b97\u6cd5\uff0c\u4f60\u4eec\u5e94\u8be5\u5b66\u8fc7\u7684\uff0c\u5192\u6ce1\u6392\u5e8f\u662f\u521d\u5b66\u8005\u5b66\u7684\u7b2c\u4e00\u79cd\u7b97\u6cd5
# include

void paixu(int a[],int n)
{ int i,j;
int t;
for (i=1;i<n;i++)
for(j=0;j<n-i;j++)
if(a[j]>a[j+1])
{ t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}

int main()
{ int n,i;
int a[1010];
while(scanf("%d",&n)!=EOF)
{ for(i=0;i<n;i++)
scanf("%d",&a[i]);
paixu(a,n);
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}
}

1\u3001\u7b2c\u4e8c\u4e2a\u4f4d\u7f6e
2\u300113\u300151\u300126\u300157\u300123\u300166\u300176\u300181\u300169
3\u3001\u7b2c\u4e8c\u4e2a\u4f4d\u7f6e
\u9009\u62e9\u8ddf\u5feb\u901f\u6392\u5e8f\u6700\u574f\u60c5\u51b5\u662f n*(n-1)/2
\u5806\u6392\u5e8f\u6700\u574f\u60c5\u51b5 o(nlng2n)

下面是C语言里面常用的三种排序方法,但愿对楼主有帮助,
一、冒泡法(起泡法)
算法要求:用起泡法对10个整数按升序排序。
算法分析:如果有n个数,则要进行n-1趟比较。在第1趟比较中要进行n-1次相邻元素的两两比较,在第j趟比较中要进行n-j次两两比较。比较的顺序从前往后,经过一趟比较后,将最值沉底(换到最后一个元素位置),最大值沉底为升序,最小值沉底为降序。
算法源代码:
# include
main()
{
int a[10],i,j,t;
printf("Please input 10 numbers: ");
/*输入源数据*/
for(i=0;i<10;i++)
scanf("%d",&a[i]);
/*排序*/
for(j=0;j<9;j++) /*外循环控制排序趟数,n个数排n-1趟*/
for(i=0;i<9-j;i++) /*内循环每趟比较的次数,第j趟比较n-j次*/
if(a[i]>a[i+1]) /*相邻元素比较,逆序则交换*/
{ t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
/*输出排序结果*/
printf("The sorted numbers: ");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
}
算法特点:相邻元素两两比较,每趟将最值沉底即可确定一个数在结果的位置,确定元素位置的顺序是从后往前,其余元素可能作相对位置的调整。可以进行升序或降序排序。
算法分析:定义n-1次循环,每个数字比较n-j次,比较前一个数和后一个数的大小。然后交换顺序。
二、选择法
算法要求:用选择法对10个整数按降序排序。
算法分析:每趟选出一个最值和无序序列的第一个数交换,n个数共选n-1趟。第i趟假设i为最值下标,然后将最值和i+1至最后一个数比较,找出最值的下标,若最值下标不为初设值,则将最值元素和下标为i的元素交换。
算法源代码:
# include
main()
{
int a[10],i,j,k,t,n=10;
printf("Please input 10 numbers:");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<n-1;i++) /*外循环控制趟数,n个数选n-1趟*/
{
k=i; /*假设当前趟的第一个数为最值,记在k中 */
for(j=i+1;j<n;j++) /*从下一个数到最后一个数之间找最值*/
if(a[k]<a[j]) /*若其后有比最值更大的*/
k=j; /*则将其下标记在k中*/
if(k!=i) /*若k不为最初的i值,说明在其后找到比其更大的数*/
{ t=a[k]; a[k]=a[i]; a[i]=t; } /*则交换最值和当前序列的第一个数*/
}
printf("The sorted numbers: ");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
}
算法特点:每趟是选出一个最值确定其在结果序列中的位置,确定元素的位置是从前往后,而每趟最多进行一次交换,其余元素的相对位置不变。可进行降序排序或升序排序。
算法分析:定义外部n-1次循环,假设第一个为最值,放在参数中,在从下一个数以后找最值若后面有比前面假设的最值更大的就放在k中,然后在对k进行分析。若k部位最初的i值。也就是假设的i不是最值,那么就交换最值和当前序列的第一个数
三、插入法
算法要求:用插入排序法对10个整数进行降序排序。
算法分析:将序列分为有序序列和无序列,依次从无序序列中取出元素值插入到有序序列的合适位置。初始是有序序列中只有第一个数,其余n-1个数组成无序序列,则n个数需进n-1次插入。寻找在有序序列中插入位置可以从有序序列的最后一个数往前找,在未找到插入点之前可以同时向后移动元素,为插入元素准备空间。
算法源代码:
# include
main()
{
int a[10],i,j,t;
printf("Please input 10 numbers: ");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=1;i<10;i++) /*外循环控制趟数,n个数从第2个数开始到最后共进行n-1次插入*/
{
t=a[i]; /*将待插入数暂存于变量t中*/
for( j=i-1 ; j>=0 && t>a[j] ; j-- ) /*在有序序列(下标0 ~ i-1)中寻找插入位置*/
a[j+1]=a[j]; /*若未找到插入位置,则当前元素后移一个位置*/
a[j+1]=t; /*找到插入位置,完成插入*/
}
printf("The sorted numbers: ");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
}
算法特点:每趟从无序序列中取出第一个数插入到有序序列的合适位置,元素的最终位置在最后一趟插入后才能确定位置。也可是先用循环查找插入位置(可从前往后或从后往前),再将插入位置之后的元素(有序列中)逐个后移一个位置,最后完成插入。该算法的特点是在寻找插入位置的同时完成元素的移动。因为元素的移动必须从后往前,则可将两个操作结合在一起完成,提高算法效率。仍可进行升序或降序排序。
二、下面是三种排序的概念及其优缺点

冒泡排序
已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变。再比较a[2]与a[3]的值,若a[2]大于a[3]则交换两者的值,否则不变。再比较a[3]与a[4],依此类推,最后比较a[n-1]与a[n]的值。这样处理一轮后,a[n]的值一定是这组数据中最大的。再对a[1]~a[n-1]以相同方法处理一轮,则a[n-1]的值一定是a[1]~a[n-1]中最大的。再对a[1]~a[n-2]以相同方法处理一轮,依此类推。共处理n-1轮后a[1]、a[2]、……a[n]就以升序排列了。
优点:稳定,比较次数已知;
缺点:慢,每次只能移动相邻两个数据,移动数据的次数多。

选择排序
已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变。再比较a[1]与a[3]的值,若a[1]大于a[3]则交换两者的值,否则不变。再比较a[1]与a[4],依此类推,最后比较a[1]与a[n]的值。这样处理一轮后,a[1]的值一定是这组数据中最小的。再将a[2]与a[3]~a[n]以相同方法比较一轮,则a[2]的值一定是a[2]~a[n]中最小的。再将a[3]与a[4]~a[n]以相同方法比较一轮,依此类推。共处理n-1轮后a[1]、a[2]、……a[n]就以升序排列了。
优点:稳定,比较次数与冒泡排序一样,数据移动次数比冒泡排序少;
缺点:相对之下还是慢。

插入排序
已知一组升序排列数据a[1]、a[2]、……a[n],一组无序数据b[1]、b[2]、……b[m],需将二者合并成一个升序数列。首先比较b[1]与a[1]的值,若b[1]大于a[1],则跳过,比较b[1]与a[2]的值,若b[1]仍然大于a[2],则继续跳过,直到b[1]小于a数组中某一数据a[x],则将a[x]~a[n]分别向后移动一位,将b[1]插入到原来a[x]的位置这就完成了b[1]的插入。b[2]~b[m]用相同方法插入。(若无数组a,可将b[1]当作n=1的数组a)
优点:稳定,快;
缺点:比较次数不一定,比较次数越少,插入点后的数据移动越多,特别是当数据总量庞大的时候,但用链表可以解决这个问题。

#include<stdio.h>
typedef struct student{
int grade;
int score[3];
double ave;
}STU;
int main()
{
int i,j,n;
double sum,ave[300];
STU s[300],t,k;
scanf("%d",&n);
for(i=0;i<n;i++)
{
sum=0.0;
scanf("%d",&s[i].grade);
for(j=0;j<3;j++)
{
scanf("%d",&s[i].score[j]);
sum=sum+s[i].score[j];
}
s[i].ave=sum/3;
}
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
{
if(s[i].ave<s[j].ave)
{
t=s[i];
s[i]=s[j];
s[j]=t;
}
if(s[i].ave==s[j].ave)
if(s[i].grade>s[j].grade)
{
k=s[i];
s[i]=s[j];
s[j]=k;
}
}
for(i=0;i<n;i++)
{
printf("%d ",s[i].grade);
for(j=0;j<2;j++)
printf("%d ",s[i].score[j]);
printf("%d\n",s[i].score[2]);
}
return 0;
}

  • c璇█涓夌鎺掑簭
    绛旓細甯哥敤鐨刢璇█鎺掑簭绠楁硶涓昏鏈変笁绉嶅嵆鍐掓场娉曟帓搴忋侀夋嫨娉曟帓搴忋佹彃鍏ユ硶鎺掑簭銆備竴銆佸啋娉℃帓搴忓啋娉℃帓搴忥細鏄粠绗竴涓暟寮濮嬶紝渚濇寰鍚庢瘮杈冿紝鍦ㄦ弧瓒冲垽鏂潯浠朵笅杩涜浜ゆ崲銆備唬鐮佸疄鐜帮紙浠ラ檷搴忔帓搴忎负渚嬶級include<stdio.h> int main(){ int array[10] = { 6,9,7,8,5,3,4,0,1,2 };int temp;for (int i = ...
  • 濡備綍鐢C璇█杩涜鎺掑簭?
    绛旓細6銆佺敤for寰幆锛岃緭鍏ュ簭鍒椾腑鐨勪釜鏁存暟锛屽苟璁剧疆姣忎釜鏁存暟鍦ㄦ暟鍒椾腑鐨勫簭鍙枫7銆佹暟鍒椾腑鐨勬墍鏈夋暟鍊锛屾寜鍏舵暣鏁板ぇ灏忚繘琛屾帓搴忋8銆佺粰鎺掑ソ搴忕殑姣忎釜鏁板硷紝娣诲姞鎺掑簭缂栧彿銆9銆佺劧鍚庯紝鎵鏈夋暣鏁版寜绱㈠紩鎺掑簭銆10銆佹渶鍚庯紝鎸夌収绱㈠紩杈撳嚭鎵鏈夋暣鏁扮殑鎺掑悕銆11銆佽繍琛岀▼搴忥紝杈撳叆瑙勫畾涓暟鐨勬暣鏁帮紝鐢佃剳灏变細杈撳嚭姣忎釜鏁存暟鍦ㄥ簭鍒椾腑鐨勬帓鍚嶃侰...
  • C璇█澶х墰鎺ㄨ崘涓冨ぇ鎺掑簭绠楁硶瀛︾敓鏉ョ湅
    绛旓細5.甯屽皵鎺掑簭 閫夋嫨涓涓閲忓簭鍒梩1,t2,"鈥,tk锛屽叾涓璽i>tj,tk=1;鎸夊閲忓腑鍒椾釜鏁発锛屽搴忓垪杩涜k 瓒熸帓搴;6.妗舵帓搴 璁剧疆涓涓畾閲忕殑鏁扮粍褰撲綔绌烘《瀛 瀵昏搴忓垪锛屽苟涓旀妸椤圭洰涓涓竴涓斁鍒板搴旂殑妗跺瓙鍘汇傚姣忎釜涓嶆槸绌虹殑妗跺瓙杩涜鎺掑簭銆7.鍩烘暟鎺掑簭 鍙栧緱鏁扮粍涓殑鏈澶ф暟锛屽苟鍙栧緱浣嶆暟:arr涓哄師濮嬫暟缁勶紝浠庢渶浣庝綅...
  • c璇█濡備綍瀹炵幇鎸変粠灏忓埌澶鎺掑簭?
    绛旓細a=c;c=t;} if(b>c){ t=b;b=c;c=t;} printf("浠庡皬鍒板ぇ鐨勯『搴忔槸锛%d %d %d\n",a,b,c);return0;}
  • 濡備綍鐢c璇█杈撳叆10涓暟骞惰繘琛鎺掑簭?
    绛旓細鐒跺悗鐢╯canf鎺ュ彈鏁扮粍锛岀敤鎴疯緭鍏10涓暟浠ュ悗锛屼細灏嗘暟瀛樺湪鏁扮粍array涓紝鐒跺悗璋冪敤涓婇潰澶勭悊鎺掑簭鐨勫嚱鏁帮紝鍑芥暟鐨勮緭鍏ュ氨鏄垰鎵嶈緭鍏ョ殑鏁帮紝鏈鍚庡湪鎶婃帓搴忕殑缁撴灉杈撳嚭鍗冲彲锛4銆佹渶鍚庣紪璇戣繍琛岋紝杈撳叆10涓暟锛屾渶鍚庢帶鍒跺彴杈撳嚭浜嗘帓搴忕殑缁撴灉锛岃瘉鏄庣▼搴忕殑閫昏緫鏄病鏈夐棶棰樼殑銆備互涓婂氨鏄C璇█杈撳叆10涓暟鎺掑簭鐨勬紨绀猴細
  • C璇█涓殑杩愮畻绗︾殑浼樺厛绾ф庝箞鎺掑簭?
    绛旓細閫塁.銆佽祴鍊艰繍绠楃<閫昏緫涓庤繍绠楃<鍏崇郴杩愮畻绗<绠楁湳杩愮畻绗︺傚綊绾冲悇绫昏繍绠楃銆愰珮鍒颁綆銆戯細鍒濈瓑杩愮畻绗︺愶紙锛夈->銆.銆 G1 鍗曠洰杩愮畻绗2 绠楁湳杩愮畻绗(鍏堜箻闄ゃ愬彇浣欍戯紝鍚庡姞鍑) G3,4 浣嶈繍绠楃銆<< >>銆 G5 鍏崇郴杩愮畻绗6,7 浣嶈繍绠楃銆愰掑噺& ^ |銆 G8,9,10 閫昏緫杩愮畻绗(涓嶅寘鎷紒) G11,12...
  • c璇█涓変釜鏁鎺掑簭浠庡皬鍒板ぇ
    绛旓細c璇█涓変釜鏁鎺掑簭浠庡皬鍒板ぇ濡備笅锛氬畾涔夋暟鎹被鍨嬶紝鏈疄渚嬩腑a銆乥銆乧銆乼鍧囦负鍩烘湰鏁村瀷銆備娇鐢ㄨ緭鍏ュ嚱鏁拌幏寰椾换鎰3涓艰祴缁檃銆乥銆乧銆備娇鐢╥f璇彞杩涜鏉′欢鍒ゆ柇锛屽鏋渁澶т簬b锛屽垯鍊熷姪浜庝腑闂村彉閲弔浜掓崲a涓巄鍊硷紝渚濇绫绘帹姣旇緝a涓 c銆乥涓巆锛屾渶缁堢粨鏋滃嵆涓篴銆乥銆乧鐨勫崌搴忔帓鍒椼備娇鐢ㄨ緭鍑哄嚱鏁板皢a銆乥銆乧鐨勫间緷娆¤緭鍑恒...
  • C璇█sort鍑芥暟濡備綍浣跨敤
    绛旓細C璇█涓病鏈夐缃殑sort鍑芥暟銆傚鏋滃湪C璇█涓紝閬囧埌鏈夎皟鐢╯ort鍑芥暟锛屽氨鏄嚜瀹氫箟鐨勪竴涓嚱鏁帮紝鍔熻兘涓鑸敤浜鎺掑簭銆備竴銆佸彲浠ョ紪鍐欒嚜宸辩殑sort鍑芥暟銆傚涓嬪嚱鏁颁负灏嗘暣鍨嬫暟缁勪粠灏忓埌澶ф帓搴忋倂oid sort(int *a, int l)//a涓烘暟缁勫湴鍧锛宭涓烘暟缁勯暱搴︺倇 int i, j;int v;//鎺掑簭涓讳綋 for(i = 0; i < l - ...
  • c璇█鐨勪袱绉鎺掑簭?
    绛旓細1銆侀夋嫨鎺掑簭娉 瑕佹眰杈撳叆10涓暣鏁帮紝浠庡ぇ鍒板皬鎺掑簭杈撳嚭 杈撳叆锛2 0 3 -4 8 9 5 1 7 6 杈撳嚭锛9 8 7 6 5 3 2 1 0 -4 浠g爜锛歩nclude<stdio.h> int main(int argc,const char*argv[]){ int num[10],i,j,k,l,temp;//鐢ㄤ竴涓暟缁勪繚瀛樿緭鍏ョ殑鏁版嵁 for(i=0;i<=9;i++){ scanf(...
  • c璇█濡備綍灏嗕竴涓暟缁勬寜鐓ф寚閽鎺掑簭?
    绛旓細1銆佸彲浠ョ洿鎺ユ壘鍒版暟缁勫搴旇鐨勫厓绱狅紝杩涜浜ゆ崲鏁版嵁锛屾敼鍙樺師鏁扮粍鍐呭銆2銆佸彲浠ュ畾涔夋寚閽堟暟缁勬寚鍚戞瘡琛岀殑棣栧湴鍧锛屼氦鎹㈡寚閽堝湴鍧锛屾寜椤哄簭鎵撳嵃姣忎釜鎸囬拡涓洪鐨勮鏁版嵁锛屽緱鍒版暟鎹氦鎹㈡晥鏋滐紝鍘熸暟缁勫唴瀹逛笉鍙樸傛垜杩欓噷鐢ㄧ2绉嶆柟娉曠粰浣犲啓浜嗕竴涓紝浣犲弬鑰冨惂銆俰nclude <stdio.h>int main (){ int nArry[4][4]={{1,...
  • 扩展阅读:c++冒泡法排序十个数 ... c语言冒泡排序怎么写 ... c语言对学生成绩排序 ... 指针排序c语言 ... c语言完整的快速排序算法 ... c语言十大算法 ... 对10个数进行排序c语言 ... c语言数组比较大小排序 ... 选择排序全过程c语言代码 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网