徐建岗网络管理 2020-03-07
冒泡排序的基本思想是:
1.在长度为n的数组,通过不断比较两个相邻元素,把值大的往后移动,当遍历完最后一个元素时,最大值存放在数组[n-1]下标位置。
2.通过步骤1的比较后,数组长度为n-1(因为arr[n-1]的元素已是整个数组最大的,没必要再比较),然后再在长n-1的数组中找出次大的数放到
arr[n-2]位置,比较完成后数组无序部分长度为 n-2,然后循环执行这步直到数组无序部分长为1。
// 在长为len 的数组中,循环 n-2次比较,把最大值放在 arr[n-1]位置void buble(int arr[], int len) { for(int i = 0; i < len-1; i++) { if(arr[i] > arr[i+1]) { int temp = arr[i]; arr[i] = arr[i+1]; arr[i+1] = temp; } } }
以上完成把数组最大的元素放在arr[n-1]位置,现在数组无序的部分只有前面的arr[0]~arr[n-2],则循环设置数组长度设置为 n-1(找出次大的放在arr[n-2]), n-2, ..., 1, 最后完成
排序,第二步代码为
void bubble_sort(int arr[], int len) { for(int i = len; i > 0; i--) //数组从长到短,每循环一次,当前数组的最大值放在其最后位置 buble(arr, i); }
总的就是
#include<stdio.h> void buble(int arr[], int len) { for(int i = 0; i < len-1; i++) { if(arr[i] > arr[i+1]) { int temp = arr[i]; arr[i] = arr[i+1]; arr[i+1] = temp; } } } void bubble_sort(int arr[], int len) { for(int i = len; i > 0; i--) buble(arr, i); } int main() { int array[6]={5, 4, 3, 5, 1}; bubble_sort(array,5); for(int i=0;i<5;i++) { printf("%d ",array[i]); } printf("\n"); return 0; }
输出为:
1 3 4 5 5
当两个相邻且相等的元素在比较时,即执行if( arr[i] > arr[i+1]) 时不会交换两个元素的位置,所有冒泡排序是稳定的。