冒泡排序:
简单来说就是把一个数组中的元素,按照从小到大(从大到小)的顺序进行重新排列,使数组的元素从第一个到最后一个的值都是越来越大(越来越小)的
比如说有一个数组
int nums[] = {5,543,23,12,1};
经过冒泡排序后
那么数组中的每个元素变成了
1 5 12 23 543
实现思路:就是两个元素两两比较,小的放后面,大的放前面
比如说有个数组:元素设置为
下标:0 1 2 3 4
--------------------------------
5 4 3 2 1
4 5 3 2 1
一共比较4次
第一轮:4 5 3 2 1 0跟0+1比较后的结果
4 3 5 2 1 1跟1+1比较后的结果
4 3 2 5 1 2跟2+1比较后的结果
4 3 2 1 5 3跟3+1比较后的结果
一共比较3次
第二轮:3 4 2 1 5
3 2 4 1 5
3 2 1 4 5
一共比较2次
第三轮:2 3 1 4 5
2 1 3 4 5
一共比较1次
第四轮:1 2 3 4 5
外面一个大的循环用来控制轮数(到底循环多少轮?)
长度-1轮
每轮里面又有一个循环控制一共比较的次数 (每轮里面又比较多少次呢?)
长度 - 轮数(轮数从1开始的)
如果轮数从0开始, 长度 - (轮数+1)
长度 - 轮数 - 1
for(int i=0;i<5-1;i++){//外层循环控制轮数,但是这个轮数从0开始
for(int j=0;j<5-i-1;j++){//比较次数
if( nums[j] > nums[j+1] ){ //判断当前的元素是否比下一个元素大
//交换这两个元素
int temp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = temp;
}
}
}
例子:
#include <stdio.h>
int main(int argc, const char * argv[]) {
int arr[] = {25,12,36,4,6,5,8,456,565,4255,45,54};
int length = sizeof(arr)/sizeof(int);
for (int i = 0; i < length - 1; i++) {
for (int j = 0; j < length -i - 1; j++) {
if (arr[j] > arr[j+1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
for (int i = 0; i < length; i++) {
printf("%d\n",arr[i]);
}
for (int i = length -1; i >= 0; i--) {
printf("%d\n",arr[i]);
}
return 0;
}
|
|