C语言数据排序专题复习
C语言数据排序专题复习
排序是将一个无序的数据序列按照某种顺序重新排列。用数组存放要排序的数据序列。本专题介绍几种常用的排序方法,均假设数据从小到大排序。
1.冒泡排序(又称起泡法)
基本思路:每轮排序找余下的数据中的最小值定位在最前,故每经过一轮排序确定一个位置,余下的数据就减少一个。n个数排序要经过n-1轮排序。排序要用二重循环实现,外循环表示排序的轮次,内循环示每轮排序将最小值交换到最前面。(以10个数从小到大排序为例)
第1轮排序,下标i的值为0,找a[0]---a[9],10个数中找最小值,将最小值交换到a[0]位置,最小值初值为a[0],要将a[1]---a[9]每个元素逐一与a[0]比较,如果比a[0]小,就与a[0]交换。
第2轮排序,下标i的值为1,找a[1]—a[9],9个数中找最小值,将最小值交换到a[1]
位置,最小值初值为a[1],要将a[2]---a[9]每个元素逐一与a[1]比较,如果比a[1]小,就与a[1]交换。
依次类推。
10个数排序,外循环变量i的取值从0----8(小于9)表示要经过9轮排序,注意观察
i=0,第1轮排序,内循环与最小值比较的元素是a[1]到a[9],
i=1,第2轮排序,内循环与最小值比较的元素是a[2]到a[9],
内循环用j表示元素下标,终值固定为9,初值i=0时,j=1;i=1时,j=2;j=i+1
程序清单:main()
{ int i,j,a[10],t; /*t用于交换的变量*/
for(i=0;i<10;i++)
scanf(“%d”,&a[i]);
for(i=0;i<9;i++)
for(j=i+1;j<10;j++)
if(a[j]
for(i=0;i<10;i++)
printf(“%4d”,a[i]); }
冒泡排序另外一种表达形式:前面程序是每轮排序找最小值定位在最前面,换一种思路,每一轮排序找最大值定位在最后面。每轮排序将相邻的元素两两比较,如果前面元素较大,则交换到后面。
程序清单:main()
{int i,j,a[10],t;
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]){t=a[j];a[j]=a[j+1];a[j+1]=t;}
for(i=0;i<10;i++)
printf(“%4d”,a[i]); }
二.选择排序(冒泡排序的改进)
在冒泡排序的基础上增加了一个变量,表示每轮排序的最小值的下标。如果每轮排序找出最小值的下标与初始值不一致时,则应交换该两个下标对应的元素,选择排序每轮排序最多交换了一次数据,大大减少了数据交换的次数。
程序清单:main()
{ int i,j,k,t;
for(i=0;i<10;i++)
scanf(“%d”,&a[i]);
for(i=0;i<9;i++)
{ k=i;
for(j=i+1;j<10;j++)
if(a[j]