冒泡排序法、选择排序法和插入排序法的排序过程

来源:互联网 发布:软件怎么下载 编辑:程序博客网 时间:2024/04/29 07:16


1.       冒泡排序法:n个数从小到大排序,经过n-1趟循环,每次循环中两两比较相邻两个数的大小,前者大于后者则将两数交换,直到最后一个,每次通过不断交换相邻两数将未排序中的最大的那个数交换到排序中的最前一位。


2.       选择排序法:n个数从小到大排序,先将第一个数认为最小的数,经过n-1趟循环,每次循环中将认为最小的数与下一个数比较,如果大于则交换这两数,直到最后一个,每次找出未排序中最小的值排在排序中的最后一位。


3.       插入排序法:将n个数看成n张扑克牌,默认手里拿到的第一张牌为最小值,接着每次拿起一张牌都与前面的第一张牌比较,大于则放在最后即可,小于则与前面的交换,继续跟前面的牌比较,直到大于前面的牌为止。


以上三种排序方法是简单常见,但是效率都很低的排序方法,高效的排序法有快速排序法等,以下程序仅在说明排序方法,重在容易理解,不重效率,实际运用时每种方法都有很大的优化空间。

/* 冒泡法排序 */void sort_1(int dat[],int n){int i,j;int temp;for(i=0;i<n-1;i++){for(j=0;j<n-1;j++){if(dat[j]>dat[j+1]){temp=dat[j];dat[j]=dat[j+1];dat[j+1]=temp;}}/* 以下{ }里内容只是为了打印出排序过程 */{int timer;printf("\n冒泡法排序第%d步结果:\t",i+1);for(timer=0;timer<n;timer++)printf("%3d ",dat[timer]);}}}
/* 选择法排序 */void sort_2(int dat[],int n){int i,j,min;int temp;for(i=0;i<n-1;i++){min=i;for(j=i+1;j<n;j++){if(dat[j]<dat[min])min=j;}if(min!=i){temp=dat[i];dat[i]=dat[min];dat[min]=temp;}/* 以下{ }里内容只是为了打印出排序过程 */{int timer;printf("\n选择法排序第%d步结果:\t",i+1);for(timer=0;timer<n;timer++)printf("%3d ",dat[timer]);}}}
/* 插入排序法 */void InsertSort(int dat[],int n){ int i,j;int temp;for(i=1;i<n;i++){temp=dat[i];for(j=i;j>0&&dat[j-1]>temp;j--){dat[j]=dat[j-1];}dat[j]=temp;/* 以下{ }里内容只是为了打印出排序过程 */{int timer;printf("\n插入法排序第%d步结果:\t",i+1);for(timer=0;timer<n;timer++)printf("%3d ",dat[timer]);}}}
#include <stdio.h>#include <stdlib.h>#define random(x) (rand()%(x))#define NUM_MAX10/* 主函数 */void main(void){int i;int buf[NUM_MAX];printf("\n原始数据:\t\t");for(i=0;i<NUM_MAX;i++){buf[i]=random(1000);printf("%3d ",buf[i]);}printf("\n");sort_3(buf,NUM_MAX);printf("\n\n排序后数据:\t\t");for(i=0;i<NUM_MAX;i++){printf("%3d ",buf[i]);}printf("\n");}
运行结果如下:





0 0
原创粉丝点击