赞
踩
冒泡法排序:顾名思义,小的数据就好像水中的气泡一样总是逐渐往上升,
大的数据就像石块一样往下沉,因此称为冒泡法排序法。
假如有n个数字,则需要进行n-1轮
第一轮结果:最大的数,被放在了最后一位
第二轮:元素 ‘8’ 已经拍好了顺序,所以只用将前4个元素进行排序
第三轮:只用将前3个元素排序即可
第四轮:只用将前2个元素比较即可
第五轮:只剩下一个元素,直接放在首位,它一定是最小的
以上就是冒泡排序的步骤
代码如下:
- /*冒泡法排序:字面意思为小的数据就好像水中的气泡一样总是逐渐往上升,
- 大的数据就像石块一样往下沉,因此称为冒泡法排序法。
- 第一轮从a[0]到a[5]依次把两个相邻的元素两两比较;每次比较后,顺序不对,
- 则交换两个元素的值,否则不交换。*/
-
- //利用冒泡排序法,对输入的数据安升序排序
- #include<stdio.h>
- int main() {
- int i, j, a[100], t;//数组元素的最大容量为100
- int n;
- printf("请输入要排序的元素个数:");
- scanf("%d", &n);
- printf("请输入要排序的元素:");
- for (i = 0; i < n ; i++) {
- scanf("%d", &a[i]);//将数据放入数组中
- }
- /*核心部分:i属于[0,n-1)即N-1次循环;j属于[0,n-1-i)*/
- for (i = 0; i < n-1 ; i++) {//这里可以写成:i<n;它表示意思是,进行n轮,最后一个没排的元素由于不满足j<n-i-1,因此不用比较,因为它一定是最小的
- for (j = 0; j < n - i - 1; j++) {//i<n-1;它的意思是:进行n-1轮,最后一个元素与紧邻右边的元素再进行一次比较,这个过程可省略,因为它在上一轮结束后,已经是比右边的小了
- if (a[j] > a[j + 1]) {
- t = a[j];
- a[j] = a[j + 1];
- a[j + 1] = t;
- }
- }
- }
- printf("排序之后为:");
- for (j = 0; j < n; j++)
- printf("%-3d", a[j]);
- return 0;
- }
运行结果为:
再来看交换法:
交换法排序: 交换法排序:
第一轮用a[0]依次与a[1],a[2],....进行比较,若次序不对就交换,否则不交换,本轮结束后,a[0]就是最小数。
第二轮用a[1]与依次与a[2],a[3],.....交换,处理方法与第一轮相同。重复上述过程,至第N-1轮(N为排序的个数),采用二重
循环,外循环变量i从0循环到N-2,共循环N-1次;内循环变量j从i+1开始循环到N-1
代码如下:
- /*交换法排序:第一轮用a[0]依次与a[1],a[2],....进行比较,若次序不对就交换,否则不交换,本轮结束后,a[0]就是最小数。
- 第二轮用a[1]与依次与a[2],a[3],.....交换,处理方法与第一轮相同。重复上述过程,至第N-1轮(N为排序的个数),采用二重
- 循环,外循环变量i从0循环到8,共循环9次;内循环变量j从i+1开始循环到N-1*/
-
- //从键盘输入10个数,按照升序排序,并输出排序结果。
- #include<stdio.h>
- int main() {
- int n;
- int i, j, t, a[100];
- printf("请输入要排序的元素个数:");
- scanf("%d", &n);
- printf("请输入要排序的元素:");
- for (j = 0; j < n; j++) {
- scanf("%d", &a[j]);
- }
- /*核心部分:i属于[0,n-1);j属于[i+1,n)*/
- for (i = 0; i < n-1; i++) {
- for (j = i + 1; j < n; j++) {
- if (a[i] > a[j]) {
- t = a[i];
- a[i] = a[j];
- a[j] = t;
- }
- }
- }
- printf("排序后为:");
- for (j = 0; j < n; j++) {
- printf("%-2d", a[j]);
- }
- return 0;
- }
运行结果为:
选择法排序:(选择法排序是交换法排序的改进版,两个核心循环没有发生变化)
是交换法排序的改进方法,在交换法中,用于排序的双重循环中,每当a[i]>a[j]时,就交换a[i],a[j],
实际上不需要每次都交换,只要增设一个变量k,用于记录每次较小数的下标,只需要在本轮比较结束后,交换a[i],a[k]即可。
- /*选择法排序*/
- #include<stdio.h>
- int main() {
- int i, j, t, k, a[100];
- int n;
- printf("请输入要排序的元素个数:");
- scanf("%d", &n);
- printf("请输入要排序的元素:");
- for (i = 0; i < n; i++) {
- scanf("%d", &a[i]);
- }
- /*核心*/
- for (i = 0; i < n - 1; i++) {
- k = i;
- for (j = i + 1; j < n; j++) {
- if (a[k] > a[j]) {
- k = j;
- }
- }if (i != k) { //即a[i]不是最小的,(已经执行过k=j;)将a[i]与后面最小的元素换位置
- t = a[i];
- a[i] = a[k];
- a[k] = t;
- }
- }printf("排序后的数组为:");
- for (i = 0; i < n; i++) {
- printf("%-3d", a[i]);
- }
- return 0;
- }//这种方法比交换法更简便,交换次数更少
以上就是最基本的:三种排序
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。