赞
踩
冒泡排序的原理就是,假设数组中有n个元素,首先每次将相邻两个数比较,则将大的数放到后面,再重复这个过程继续和下一个数比较,那么一次循环过后,就会将整个数组中最大的数放在最后,第二次循环后第二大的数就会被放到倒数第二,以此类推,进行n-1次循环后整个数组就变成了从小到大排列。
#include<stdio.h> int main() { int i,j,t,k; int a[10]={10,6,4,8,9,5,7,2,1,3}; for(i=0;i<10;i++)//定义整体循环的次数 { for(j=0;j<10;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("%d ",a[i]); } return 0; }
这是运行截图,以及每一次交换后新的数组
这里的插入排序指的是先给定一个有序的数组,再将其他数字按照一定的规律插入进去,使得最终的数组还是有序的,这是插入排序里较为简单的一种类型
例如我们定义一个数组a[5]={1,3,7,9},再尝试将x=5,这个数插入到数组中,显然,应该反放到第三个位置,也就是满足x>a[i-1]且x<a[i+1]的位置。并且我们要做的工作还有要将此位置后面的数据都要向后移一位,这才能让x插入进来。那么这就导致了我们寻找这个位置的时候必须要从数组最后的位置开始,在没有找到这个位置时都将数据向后赋值,才能满足。
#include<stdio.h> int main() { int a[10]={1,3,7,9}; int i,j,x=5; for(i=0;i<4;i++) { printf("%d ",a[i]); } printf("\n"); i=3;//从数组最后的位置开始循环 while(x<=a[i]&&i>=0)//当x的值没有比这个数大,并且这个数依然在数组中时,继续循环 { a[i+1]=a[i]; i--;//继续向前移动寻找 } a[i+1]=x;//将x的值赋给找到的位置的数组元素 for(i=0;i<5;i++) { printf("%d ",a[i]); } return 0; }
无序数组的插入排序也与之前的思路类似,只不过多了一个循环用来提取无序数组中的数,其他代码的意义和有序数组中的插入排序基本相同,总的来说就是从第二个数开始,依次将其插入到前面的序列中使之一直是有序序列
#include<stdio.h> int main() { int a[10]={10,6,4,8,9,5,7,2,1,3}; int i,j,x; for(i=1;i<10;i++) { x=a[i];//从无序数组中抽出一个数 j=i-1;//从此位置开始循环 while(x<=a[j]&&j>=0)//将x插入到前面的序列中 { a[j+1]=a[j]; j--; } a[j+1]=x; } for(i=0;i<10;i++) { printf("%d ",a[i]); } return 0; }
这是运行截图,以及每一次交换后新的数组
选择排序与冒泡排序类似,但也有不同之处。其实质是,先在整个数组中选出最小的数,将其与数组中第一个元素交换位置,再在省下的元素中选出最小的数与数组中第二个元素交换位置,以此类推最终形成一个有序的数组
#include <stdio.h> void main() { int i,j; int a[10]={10,6,4,8,9,5,7,2,1,3}; int min,t,x; for(i=0;i<9;i++) { min=a[i]; for(j=i+1;j<10;j++) { if(min>a[j])//选出剩余数组元素中最小的那个 { min=a[j]; x=j;//获得该元素在数组中的位置 } } t=a[i];//交换数值 a[i]=a[x]; a[x]=t; } for(i=0;i<10;i++) { printf("%d ",a[i]); } return 0; }
每一次交换后数组如图所示。
这三种排序方式其实思路都有很多共同之处,都是利用了比较大小之后交换对应的值,只是插入排序稍微有些抽象,但真正理解之后也不是很难,而且代码复杂度也比较小,冒泡排序与选择排序则都是常规的思路,比较简单,在不同的题目中选择不同的方法可以大大提高我们的效率,以及减少代码的复杂程度。
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。