主要内容
冒泡排序 选择排序 插入排序
主要的技术
for的两层循环体 两个数组元素实现交换
冒泡排序
实现方式:每次遍历整个数组,找到最大的一个沉底
若数组有N个元素,
第一次需要遍历N-1次,
第二次需要遍历N-2次,
……
总共需要比较N-1次
代码如何实现
两层循环:
(1)、第一层循环控制需要遍历多少次
e.g3 0 1 8 7 25 4 9 6共10个元素,只需要遍历(10-1)次
(2)、第二层循环控制每次需要遍历多少次才能找到最大(内层循环)
每次从i=0开始,让i和i+1进行比较,确保i+1是最大的
注:(一般来说,程序里尽量做到循环层小于等于2层)
一个循环 | 两个循环 |
---|---|
一次遍历就结束 | 每一次内部又有遍历 |
冒泡排序代码
#include <stdio.h>
int main(){
int num[10] = {3,0,1,8,7,2,5,4,9,6};
for(int i = 0; i < 10-1; i++){//第一层循环控制总共便利的次数
for(int j = 0; j < 10 - i; j++){//第二层循环 开始每一次遍历,找到一个最大的数沉底
//让j和j+1进行比较
if(num[j] > num[j+1]){
//交换数组元素的值
int temp = num[j];
num[j] = num[j+1];
num[j+1] = temp;
}
}
}
//输出按从小到大排序的数组元素
for(int i = 0; i < 10; i++){
printf("%d ",num[i]);
}
return 0;
}
选择排序
实现方式
取出数组元素num[i]所对应的的值,默认为最小的,利用temp保存最小的元素,让temp和num[i]后面的每个数进行比较,temp始终保存最小的那个数
代码如何实现
两层循环:
(1)、第一层循环控制总共需要遍历多少次
e.g3 0 1 8 7 2 5 4 9 6共10个元素,只需要遍历(10-1)次
(2)、第二层循环遍历出当前最小的数
选择排序代码
#include <stdio.h>
int main(){
int num[10] = {3,0,1,8,7,2,5,4,9,6};
for(int i = 0; i < 10-1; i++){
int temp = num[i];//取出i对应的值,默认是最小的数
for(int j = i+1; j < 10; j++){
if(temp > num[j]){
int n = temp;
temp = num[j];
num[j] = n;
}
}
num[i] = temp;
}
for(int i = 0; i < 10; i++){
printf("%d",num[i]);
}
return 0;
}
插入排序
实现方式
首先让num[i]和num[i+1]进行大小比较,数值小的往前移,再让num[i]和前面所有的元素进行比较,将最小的值置于最前面
代码如何实现
两层循环:
(1)、第一层循环控制总共需要遍历多少次
e.g3 0 1 8 7 2 5 4 9 6共10个元素,只需要遍历(10-1)次
(2)、第二层循环实现数组元素与之前的元素进行比较大小,最小的元素在最前
插入排序代码
#include <stdio.h>
int main(){
int num[10] = {3,0,1,8,7,2,5,4,9,6};
for(int i = 0; i < 10-1; i++){
if(num[i] > num[i+1]){
int temp = num[i];
num[i] = num[i+1];
num[i+1] = temp;
}
for(int j = i; j > 0; j--){
if(num[j] > num[j-1]){
break;
}else{
int temp = num[j];
num[j] = num[j-1];
num[j-1] = temp;
}
}
}
for(int i = 0; i <10; i++){
printf("%d ",num[i]);
}
return 0;
}