1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > C语言数组的五种简单排序 选择法排序 冒泡法排序 交换法排序 插入法排序 折半法排序

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

时间:2023-11-29 13:45:10

相关推荐

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

文章目录

1、选择法排序2、冒泡法排序3、交换法排序4、插入排序5、折半法排序6、五种方法比较

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、插入排序

插入法排序基本思想是抽出一个数据,在前面的数据中寻找相应的位置插入然乎继续找下一个元素,直至结束

在第一次排序过程中将第一个数取出来,并放置在第一个位置然后取出第二个数,并将第二个数与第一个数进行比较,如果第二个数小于第一个数,则将第二个数排在第一个数之前,否则将第二个数排在第一个数之后;然后取出下一个数,先与排在后面的数字进行比较,如果当前数字较大则排在最后,如果当前数字比较小,还要与之前的数字进行比较,如果当前数字比前面的数字小,则将当前数字排在比它小的数字和比它大的数字之间,如果没有比当前数字小的数字,则将当数字排在最前方。依此类推,不断取出未进行排序的数字与排序好的数字进行比较,并插入到相应的位置,直到将一组数字按从小到大排序为止。 代码实现:需要声明一个整型数组,两个整型变量。数组用于存放输入的数据,两个整型变量分别用于存放交换数据时候的中间变量以及记录数据元素的位置 代码实现如下:

#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 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,然后把比中间值小的数据放在左边,比中间值大的放在右边(这里是从小到大排序。具体实现就是从两边找,找到一对后进行交换),然后两边分别递归使用这一过程。小代码实现:

#include<stdio.h>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较小时,对稳定性不作要求时宜用选择法排序,对稳定性有要求时宜用插入法或冒泡法排序。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。