冒泡排序c语言实现

冒泡排序的基本思想是:

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]) 时不会交换两个元素的位置,所有冒泡排序是稳定的。