冒泡排序 c语言实现

冒泡排序思想:从单个方向(比较,交换)每次得到一个最小或者最大数。
1,将第一个元素和第二个元素进行比较,若为逆序(arr[1]<arr[2]),则交换它们的位置,然后比较第二个元素和第三个元素
      进行比较。以此类推,直至第n-1个元素和第n个元素进行比较为止。这个过程为一趟冒泡排序,使得最大元素被交换到
      数组的尾部。
2,然后对前n-1个元素按步骤1进行第二趟冒泡排序,其结果是将次大关键字放到n-1的位置上。
3,一般地,第i趟起泡排序是从arr[1]到arr[n-i+1]依次比较相邻元素,如果有“逆序”则交换。其结果是这n-i+1个记录中的最大
     元素被交换到n-i+1位置上。

打印输出函数:

#include <stdio.h>

static int print_arr(char *pflag, int *arr, unsigned int len)
{
        if (!arr || !len) {
                return -1;
        }

        if (pflag) {
                printf("%s:  ", pflag);
        }

        for (unsigned int i=0; i<len; i++) {
                printf("%d  ", arr[i]);
        }

        printf("\n");
        return 0;
}

冒泡排序函数:

static int bubble(int *arr, unsigned int len)
{
        if (!arr || !len) {
                return -1;
        }

        bool bflag = false;
        int tmp = 0;

        for (unsigned int i=len-1; i>0; i--) {
                for (unsigned int j=0; j<i; j++) {
                        if (arr[j] > arr[j+1]) {
                                bflag = true;

                                tmp = arr[j+1];
                                arr[j+1] = arr[j];
                                arr[j] = tmp;
                        }
                }

                if (!bflag) {
                        break;
                } else {
                        bflag = false;
                }
        }


        return 0;
}

测试代码:

int main(void)
{
        int arr[] = {1, 19, -2, 0, 180, 200, 7, 9};

        unsigned int arrlen = sizeof(arr)/sizeof(int);

        (void)print_arr("start", arr, arrlen);

        int ret = bubble(arr, arrlen);
        if (ret < 0) {
                printf("param error\n");
                return -1;
        }

        (void)print_arr("end", arr, arrlen);

        return 0;
}

结果:

start:  1  19  -2  0  180  200  7  9	
end:  -2  0  1  7  9  19  180	200	

猜你喜欢

转载自blog.csdn.net/meiyoudao_jiushidao/article/details/80878906