点击查看代码
#include <stdio.h>
int main(){
// 冒泡排序
/**
* 冒泡排序是从头开始,相邻两个元素进行比较
* 要通过双重循环,第一重循环是元素间要比较的轮数,终止条件是元素个数减一,
* 因为第一次是将数组中最大的元素移动到倒数第一个,第二次是将数组中第二大的数移动到倒数第二个
* ···由此可推,最后一个最小的元素便不用再进行比较
* 第二重循环是从头开始,相邻两个元素进行比较,(3和2比,3大,则交换两者位置→arr[0]=2,arr[1]=3;
* 接着3和1比,3大,则交换→arr[1]=1,arr[2]=3;接着3和6比,6大,不变;接着6和5比,6大,交换→arr[3]=5,arr[4]=6)···
* 如此其终止条件为元素个数减1再减i,因为倒数i个元素已经排序好,是最大的i个元素
**/
int arr[] = {3,2,1,6,5,8,7,9,4,0};
//可以增加动态计算数组长度
//int arrSize = sizeof(arr) / sizeof(arr[0]);
for(int i = 0 ; i < 10 - 1 ; i++){
for(int j = 0 ; j < 10 - 1- i ; j++){
if(arr[j] > arr[j+1]){
int t = arr[j];
arr[j] = arr[j+1];
arr[j+1] = t;
}
}
}
for(int i = 0 ; i < 10 ; i++){
printf("%d",arr[i]);
}
// 选择排序
/*
选择排序的核心是:每一轮确定「未排序区间第一个元素」的最终位置
双重循环:
1. 第一重循环(i):控制未排序区间的起点(i是当前要确定位置的元素下标),
终止条件是元素个数-1(因为最后1个元素无需再比较,自然是最大值);
2. 第二重循环(j):从i的下一个元素开始,遍历所有未排序元素,
把比arr2[i]小的元素逐个和arr2[i]交换,最终让arr2[i]成为未排序区间的最小值;
(此版本是选择排序的“交换版”,每轮找到更小的元素就立即交换,逻辑正确)
*/
int arr2[] = {3,2,1,6,5,8,7,9,4,0};
for(int i = 0 ; i < 10 - 1 ; i++){
for(int j = i + 1; j < 10 ; j++){
if(arr2[i] > arr2[j]){
int t = arr2[i];
arr2[i] = arr2[j];
arr2[j] = t;
}
}
}
for(int i = 0 ; i < 10 ; i++){
printf("%d",arr2[i]);
}
return 0;
}