C语言 冒泡法排序,选择法排序和插入排序
实例1 冒泡法排序
数组中有N个整数,用冒泡法将它们从小到大(或从大到小)排序。
实例解析:
排序是非常重要且很常用的一种操作,有冒泡排序、选择排序、插入排序、希尔排序、快速排序、堆排序等多种方法。这里我们先简单介绍前三种排序算法和代码的实现,其余算法将在后续课程《数据结构》中学习到。
冒泡法排序是C语言教材中已经介绍过的排序方法,与其他排序方法比较起来,冒泡法效率是最低的,但因其算法简单,故也常被采用,其算法是:
(1)从第一个数开始,相邻两个数两两比较,将大的(或小的)交换到后面,然后继续比较第2、3个数…..当比较完最后两个数的时候,最大数(或最小数)便排在最后了。此过程称为“一趟”。
(2)将最大数排除在外,其余数重复步骤1。
(3)重复步骤2,直到所有数都排好为止。
对于有N个数的排序,上面的过程总共需要进行N-1趟。
下面是冒泡法排序的代码:
#include <stdio.h>
#define N 10
int main()
{int a[N] = {3,5,2,9,7,4,8,1,0,6}, i, j, t;
for(i = 0; i < N-1; i++){ //共进行N-1趟
for(j = 0; j < N–i-1; j++) /*已排好的数据不参与比较 */
if(a[j] > a[j+1]){
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
for(i = 0; i <= N-1; i++)
printf(“%3d”, a[i]);
printf(“\n”);
getch();
return 0;
}
实例2 选择法排序
数组中有N个整数,用选择法将它们从小到大排序。
实例解析:
选择法是被较多采用的一种排序方法,其效率比冒泡法高(交换数据的次数少),而算法却并未复杂多少。
选择法排序总的思路是:
1、找出一个最小数,交换到最前面。
2、在剩下的数里面,再找一个最小的,交换到剩下数的最前面
3、重复步骤2 ,直到所有数都已排好。
显然,对于含有N个数的数组来说,其过程也要进行N-1趟 ( 0 <= i < N-1 )。
上面所述步骤中,“找出一个最小数,交换到最前面”的方法是:
先将剩下数中的第一个数(序号是i)作为擂主,用变量k记下其序号,后面的数依次与擂主(注意:擂主是a[k],不总是a[i])比较,若比擂主还小,则用k记下其序号(注意:此时不要交换),当所有数都与擂主比较后,k中存放的就是最小数的序号,然后将它交换到最前面(现在才交换)。在上面的过程中,数据只交换了一次,即每趟只交换一次数据。
代码如下:
#include <stdio.h>
#define N 10
int main()
{int a[N] = {3,5,2,9,7,4,8,1,0,6}, i, j, k, t;
for(i = 0; i < N-1; i++){ //共进行N-1趟
/* 首先将最前面数当作擂主,记录其序号 */
k = i; //当进行第i趟时,最前面数的序号是i
/* 后面的每一个数都与擂主进行比较,以便找出最小数 */
for(j = i+1; j <= N-1; j++)
if(a[j] < a[k]) //擂主是a[k],未必总是a[i]
k = j; //若比擂主还小,则记录其序号
/* 将最小数交换到(剩下数的)最前面 */
t = a[k];
a[k] = a[i];
a[i] = t;
}
for(i = 0; i <= N-1; i++)
printf(“%3d”, a[i] );
printf(“\n”);
getch();
return 0;
}
实例3 插入排序
数组中有N个整数,用插入排序实现它们由小到大的排列。
实例解析:
插入排序也是常用的一种排序方法,效率较冒泡法高(一趟即可完成),但比选择法低(移动数据次数多)。其基本思想是:将数组分成两个区:前面是已排序的区域(有序区),后面是没有排序的区域(无序区)。每次都从无序区中取第一个数插入到有序区中适当位置,直到所有数据插入完毕为止。
算法的具体描述是:
待排序的数据存放在数组A[0, 1, ...N-1]中,未排序前,A[0]自己是一个有序区,A[1, 2, ...N-1]是无序区。程序必须从i = 1开始,直到i = N-1为止,每次将A[i]插入到有序区中。
插入排序与打扑克摸牌时的理牌过程很相似,当摸来第一张牌时,不需要排序,本身就是排好的(就一张),从第二张开始,每次摸来一张牌,必须插入到原来有序的扑克牌中的适当位置,而为了找到这个适当位置,需要将新摸来的牌与手中的牌进行比较。
基本的插入排序:
首先在有序区A[0,1,...i-1]中查找A[i]应该插入的位置k(0 <= k <= i-1),然后将A[k,k+1,...i-1]中的数据各自后移一个位置,腾出位置k插入A[i]。
若有序区所有数据均小于A[i]时,A[i]就应该在原位置不变,不需要插入。
改进后的插入排序:
将待插入的数据A[i]自右至左依次与有序区的数据A[i-1,i-2,...0]进行比较,若A[i]小于某数据A[j],则A[j]后移一个位置,继续与前面的数据比较......直到遇到比A[i]小的数据或前面已没有数据,则插入位置确定。
若碰到一个数据A[j]比A[i]小,则A[i]应插入到位置j+1。
若A[i-1]比A[i]小,则A[i]位置不变。
若所有数据都比A[i]大,则A[i]应插入到位置0。
下面是改进后插入排序的代码:
#define N 10
#include <stdio.h>
int main()
{int a[N] = {3,5,2,9,7,4,8,1,0,6}, i, j, t;
for(i = 1; i <= N-1; i++){
t = a[i]; //保存a[i],因a[i]会被覆盖
for(j = i-1; a[j]>t && j>=0; j--) // a[j]>t不能写成a[j]> a[i]
a[j+1] = a[j];
a[j+1] = t;
}
for(i = 0; i <= N-1; i++)
printf(“%3d”, a[i] );
printf(“\n”);
getch();
return 0;
}
C语言 冒泡法排序,选择法排序和插入排序相关推荐
- c语言排序算法插入法,C语言中冒泡法、选择法、插入法三种常见排序算法分析.doc...
C语言中冒泡法.选择法.插入法三种常见排序算法分析.doc 一.冒泡法(起泡法) 算法要求用起泡法对10个整数按升序排序. 算法分析如果有n个数,则要进行n-1趟比较.在第1趟比较中要进行n-1次相邻 ...
- C语言学习之用选择法对10个整数排序
用选择法对10个整数排序 法一: int main(){int min,temp;//定义 int zu[10]={10,2,6,4,3,8,1,5,74,25};//定义数组 int length; ...
- 排序-选择类排序--堆排序简介
参考:数据结构(严蔚敏) 选择类排序有两个经典算法,一个是之前总结过的直接选择排序,另一个则是今天要讲的堆排序 0.什么是堆 对于Java中的一个数组Array,如果对于其中所有的元素其下标index ...
- C语言中数组的排序算法详解——选择法、冒泡法、交换法、插入法、折半法
选择法排序 选择法排序是指:如果要把一个数组从小到大排列,那么就从该数组中依次选择最小的数字来排序.从第一个数字开始,将第一个数字与数组中剩下数字中最小的那一个交换位置,然后将第二个数字与剩下数字中最 ...
- C语言数组的五种简单排序,选择法排序,冒泡法排序、交换法排序、插入法排序、折半法排序
文章目录 1.选择法排序 2.冒泡法排序 3.交换法排序 4.插入排序 5.折半法排序 6.五种方法比较 1.选择法排序 选择法排序是指每次选择索要排序的数组中的最小值(这里是由小到大排序,如果是由大 ...
- C语言排序之选择法排序
C语言排序算法-选择法排序 选择法排序 相关例程代码 选择法排序 选择法排序指每次选择所要排序的数组中的最大值(降序)或最小值(升序)的数组元素,将这个数组元素的值与最前面没有进行排序的数组元素的值互 ...
- linux编程排序,Linux下简单的c编程——选择法排序
针对函数和数组的C语言的学习,我今天来写一个比较典型的数组和函数的结合的例子--选择法排序 选择法顾名思义,先选择最大和最小的数,然后再进行排序 第一步首先附上我的代码.第一段代码是实现从大到小排序, ...
- C语言冒泡法和选择排序法
C语言冒泡法和选择排序法 1.冒泡法代码 #include<stdio.h> int main() {int a[3];int p,i,tmp;for(i=0;i<3;i++)sca ...
- C语言中的选择法排序怎么,请问高手们 C语言中选择法排序和冒泡法排序的思想,两种方法有何不同,搞不懂,请举例详细说明一下.谢谢。...
满意答案 yl6485 2013.04.01 采纳率:48% 等级:12 已帮助:6958人 不同点:冒泡法是顾名思义就是把小的泡冒到上面,大的泡沉到下面,最值在中间和其他的值交换: 而选择法, ...
最新文章
- .NET调用JAVA的WebService方法
- anacoda的spyder在调用matplotlib的时候无法显示动画效果【学习笔记】
- Python写在开始
- java边遍历边删除的问题
- java判断文件或者文件夹
- python 加锁_python之给文件加锁(fcntl模块)
- ajax post提交数据_详解Ajax异步加载
- lambdas for_借助Java 8和lambdas,可以一起使用AssertJ和Awaitility
- 21世纪的设计模式:抽象工厂模式
- java 获取 网卡名称_Java获取网卡信息详解
- shopnc框架数据库查询限制30条记录
- HMM-MEMM-CRF
- CSS3 filter属性学习
- 内存泄漏分析小工具分享(基于UMDH)
- 云计算,SDN,虚拟化三者关系
- ROST情感分析的语法规则_大数据之数据仓库Hive架构分析
- 信息学奥赛一本通1159:斐波那契数列
- 押宝线下渠道 能否拯救陷入芯片困境的魅族?
- 解决 Ubuntu 安装显卡驱动后,屏幕变黄的原因
- 为什么Java的图标是一杯咖啡呢?