C语言数组的五种简单排序,选择法排序,冒泡法排序、交换法排序、插入法排序、折半法排序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C语⾔数组的五种简单排序,选择法排序,冒泡法排序、交换法排序、插⼊法排
序、折半法排序
⽂章⽬录
1、选择法排序
选择法排序是指每次选择索要排序的数组中的最⼩值(这⾥是由⼩到⼤排序,如果是由⼤到⼩排序则需要选择最⼤值)的数组元素,将这些数组元素的值与前⾯没有进⾏排序的数组元素值进⾏互换
代码实现需要注意的是:声明⼀个数组和两个整形变量,数组⽤于存储输⼊的数字,⽽整形变量⽤于存储最⼩的数组元素的数值与该元素的位置,在我的代码中实现为a[] temp position。

代码具体如下
#include<stdio.h>
int main()
{
int m,n,k;
printf("please input the length of the array:");
scanf("%d",&k);
int a[k];
int temp;
int position;
printf("please input the number of the array:\n");
for(m=0;m<k;m++)
{
printf("a[%d]=",m+1);
scanf("%d",&a[m]);
}
/*从⼩到⼤排序*/
for(m=0;m<k-1;m++)
{
temp=a[m]; //设置当前的值为最⼩值
position=m; //记录当前的位置
for(n=m+1;n<k;n++)
{
if(a[n]<temp)
{
temp=a[n]; //如果找到⽐当前的还要⼩的数值,则更换最⼩的数值与位置
position=n;
}
}
a[position]=a[m];
a[m]=temp;
}
for(m=0;m<k;m++)
{
printf("%d\t",a[m]);
}
return 0;
}
结果如下
2、冒泡法排序
冒泡法排序就是值在排序时,每次⽐较数组中相邻的两个数组元素的值,将⽐较⼩的(从⼩到⼤排序算法,如果是从⼤到⼩排序算法就是将较⼤的数排在较⼩的数前⾯)排在⽐较⼤的前⾯
在代码实现的过程中:声明⼀个数组与⼀个整型变量,数组⽤于存放数据元素,整型变量⽤于交换时作为中间变量。

然后通过双层循环实现冒泡法。

代码具体如下
#include<stdio.h>
int main()
{
int m,n,k;
printf("please input the length if the array:"); scanf("%d",&k);
int a[k];
int temp;
for(m=0;m<k;m++)
{
printf("a[%d]=",m+1);
scanf("%d",&a[m]);
}
/*从⼩到⼤排序*/
for(m=0;m<k;m++) //外层循环为k-1次 {
for(n=k-1;n>m;n--) //内层循环下标为m~9 {
if(a[n]<a[n-1])
{
temp=a[n-1];
a[n-1]=a[n];
a[n]=temp;
}
}
}
for(m=0;m<k;m++)
{
printf("%d\t",a[m]);
}
return 0;
}
结果如下
3、交换法排序
交换发排序就是将每⼀位数依次与其后⾯所有的数⼀⼀⽐较,如果发现符合条件就交换数据。

⾸先⽤第⼀个数依次与其后的所有数据进⾏⽐较,如果存在⽐其⼩的数(这⾥采⽤的是从⼩到⼤排序,如果从⼤倒下排序反过来就⾏)就交换数据。

然后⽤现在这个位上的数与后⾯的数⽐较,⼀直到最后⼀个数。

然后向下进⾏,直⾄到最后⼀个数。

结束
代码实现:声明⼀个整数与整型数组,数组⽤于存放输⼊的数据,整型数据⽤于交换的充当中间变量
代码具体如下
#include<stdio.h>
int main()
{
int m,n,k;
printf("please input the length if the array:");
scanf("%d",&k);
int a[k];
int temp;
for(m=0;m<k;m++)
{
printf("a[%d]=",m+1);
scanf("%d",&a[m]);
}
/*从⼩到⼤排序*/
for(m=0;m<k-1;m++)
{
for(n=m+1;n<k;n++)
{
if(a[m]>a[n])
{
temp=a[n];
a[n]=a[m];
a[m]=temp;
}
}
}
for(m=0;m<k;m++)
{
printf("%d\t",a[m]);
}
return 0;
}
结果如图
为了⽅便分析程序的过程,对原始程序更改⼀下。

把每⼀步具体每个数组位置的上元素打印出来,代码如下
#include<stdio.h>
int main()
{
int m,n,k;
printf("please input the length if the array:");
scanf("%d",&k);
int a[k];
int temp;
int times=0;
for(m=0;m<k;m++)
{
printf("a[%d]=",m+1);
scanf("%d",&a[m]);
}
printf("The original array is:");
for(m=0;m<k;m++)
{
printf("%d\t",a[m]);
}
printf("\n");
/*从⼩到⼤排序*/
for(m=0;m<k-1;m++)
{
for(n=m+1;n<k;n++)
{
if(a[m]>a[n])
{
temp=a[n];
a[n]=a[m];
a[m]=temp;
}
times++;
printf("the %d times for exchange:",times); for(int i=0;i<k;i++)
{
printf("%d\t",a[i]);
}
printf("\n");
}
}
printf("\nthe last result:");
for(m=0;m<k;m++)
{
printf("%d\t",a[m]);
}
return 0;
}
图⽚如下
4、插⼊排序
插⼊法排序基本思想是抽出⼀个数据,在前⾯的数据中寻找相应的位置插⼊然乎继续找下⼀个元素,直⾄结束数据元素【0】元素【1】元素【2】元素【3】元素【4】起始值961542
第⼀次9
第⼆次69
第三次6915
第四次46915
排序结果246915
在第⼀次排序过程中将第⼀个数取出来,并放置在第⼀个位置然后取出第⼆个数,并将第⼆个数与第⼀个数进⾏⽐较,如果第⼆个数⼩于第⼀个数,则将第⼆个数排在第⼀个数之前,否则将第⼆个数排在第⼀个数之后;然后取出下⼀个数,先与排在后⾯的数字进⾏⽐较,如果当前数字较⼤则排在最后,如果当前数字⽐较⼩,还要与之前的数字进⾏⽐较,如果当前数字⽐前⾯的数字⼩,则将当前数字排在⽐它⼩的数字和⽐它⼤的数字之间,如果没有⽐当前数字⼩的数字,则将当数字排在最前⽅。

依此类推,不断取出未进⾏排序的数字与排序好的数字进⾏⽐较,并插⼊到相应的位置,直到将⼀组数字按从⼩到⼤排序为⽌。

代码实现:需要声明⼀个整型数组,两个整型变量。

数组⽤于存放输⼊的数据,两个整型变量分别⽤于存放交换数据时候的中间变量以及记录数据元素的位置 代码实现如下:
int main()
{
int m,n,k;
printf("please input the length if the array:");
scanf("%d",&k);
int a[k];
int temp;
int position;
for(m=0;m<k;m++)
{
printf("a[%d]=",m+1);
scanf("%d",&a[m]);
}
/*从⼩到⼤排序*/
for(m=1;m<k;m++) //外层循环为k次
{
temp=a[m]; //temp为需要插⼊的元素
position=m-1; //position为需要插⼊位置前⼀个位置
while((position>=0)&&(temp<a[position]))
{
a[position+1]=a[position]; //插⼊位置前⼀个位置元素后移
position--; //位置继续减是往前移判断前⾯的元素是否也需要后移
/*(这⾥是最难理解的,⽐较前⾯⼏种排序算法是特别难得,抓住⼀个点:上⼀个元素后移之后还需要继续向前⾯移动去判断)*/
}
a[position+1]=temp; //position⼀直减到不满⾜插⼊条件,再往后加⼀位才是元素插⼊位置
}
for(m=0;m<k;m++)
{
printf("%d\t",a[m]);
}
return 0;
}
效果如图:
5、折半法排序
折半法排序⼜称为快速排序,是选择⼀个中间值middle,然后把⽐中间值⼩的数据放在左边,⽐中间值⼤的放在右边(这⾥是从⼩到⼤排序。

具体实现就是从两边找,找到⼀对后进⾏交换),然后两边分别递归使⽤这⼀过程。

⼩代码实现:
void binarysort(int left,int right,int array[])
{
int m,n;
int middle,temp;
m=left;
n=right;
middle=array[(left+right)/2]; //求中间值
do
{
while((array[m]<middle)&&(m<right)) //从左到右找⼩于中间值的数
{
m++;
}
while((array[n]>middle)&&(n>left)) //从右到左找⼤于中间值的数
{
n--;
}
if(m<=n) //找到不符合左边⼩于中间值,右边⼤于中间值的数对 {
temp=array[m];
array[m]=array[n];
array[n]=temp;
m++;n--;
}
}while(m<=n);//如果两边的下标交错,就停⽌(完成⼀次)
/*递归左半边*/
if(left<n)
binarysort(left,n,array);
/*递归右半边*/
if(right>m)
binarysort(m,right,array);
}
int main()
{
int i,k;
printf("please input the length of array:");
scanf("%d",&k);
int a[k];
printf("please input the number of the array:\n");
for(i=0;i<k;i++)
{
printf("a[%d]=",i+1);
scanf("%d",&a[i]);
}
/*从⼩到⼤排序*/
binarysort(0,k,a);
for(i=0;i<k;i++)
{
printf("%d\t",a[i]);
}
}
结果如下图
6、五种⽅法⽐较
(1)选择法排序
选择法排序在排序过程中共需进⾏n(n-1)/2次⽐较,互相交换n-1次。

选择法排序简单、容易实现,适⽤于数量较⼩的排序。

(2)冒泡法排序
最好的情况是正序,因此只要⽐较⼀次即可最坏的情况是逆序,需要⽐较n^2次。

冒泡法排序是稳定的排序⽅法,当待排序列有序时,效果⽐较好。

(3)交换法排序
交换法排序和冒泡法排序类似,正序时最快,逆序时最慢,排列有序数据时效果最好。

(4)插⼊法排序
此算法需要经过n-1次插⼊过程,如果数据恰好应该插⼊到序列的最后端,则不需要移动数据,可节省时间,因此若原始数据基本有序,此算法具有较快的运算速度。

(5)折半法排序
折半法排序对于较⼤的n时,是速度最快的排序算法;但当n很⼩时,此⽅法往往⽐其他排序算法还要慢。

折半法排序是不稳定的,对应有相同关键字的记录,排序后的结果可能会颠倒次序。

插⼊法、冒泡法、交换法排序的速度较慢,但参加排序的序列局部或整体有序时,这种排序就能达到较快的速度在这种情况下,折半法排序反⽽会显得速度慢了。

当n较⼩时,对稳定性不作要求时宜⽤选择法排序,对稳定性有要求时宜⽤插⼊法或冒泡法排序。

相关文档
最新文档