冒泡排序

来源:互联网 发布:网络推广要学哪些课程 编辑:程序博客网 时间:2024/06/08 05:39

冒泡排序是交换排序的一种。将待排序的数组Array[n]中的元素理解为不同重量的气泡Array[i],排序时重的气泡下沉,轻的气泡上浮,直到所有的气泡都是轻的气泡在上,重的气泡在下。
基本的冒泡排序算法:

#include<stdio.h>void BubbleSort(int *array, int n) {    int a, i, j;    for (i = n - 1; i > 0; i--) {        for(j=0;j<i;j++)            if (*(array + j) > *(array + j + 1)) {                a = *(array + j);                *(array + j) = *(array + j + 1);                *(array + j + 1) = a;            }    }}void main() {    int array[8] = { 5,9,2,16,7,4,12,15 };    int i;    printf("待排序数组:");    for (i = 0; i < 8; i++) {        printf("%d ", *(array + i));    }    getchar();    BubbleSort(array, 8);    printf("\n排序后的数组:");    for (i = 0; i < 8; i++) {        printf("%d ", *(array + i));    }    printf("\n\n");}

记录最后一次交换发生位置的冒泡排序算法:

#include<stdio.h>void BubbleSort(int *array, int n) {    int bound = n;    int m, i;    int a;    while (bound != 0) {        m = 0;        for (i = 0; i < bound; i++) {            if (*(array + i) > *(array + i + 1)) {                a = *(array + i);                *(array + i) = *(array + i + 1);                *(array + i + 1) = a;                m = i;  //记录最后一次发生交换的位置            }        }        bound = m;    }}void main() {    int array[9] = { 36,80,15,26,33,2,96,46,83 };    int i;    printf("待排序数组:");    for (i = 0; i < 9; i++) {        printf("%d ", *(array + i));    }    getchar();    BubbleSort(array, 9);    printf("\n排序后的数组:");    for (i = 0; i < 9; i++) {        printf("%d ", *(array + i));    }    printf("\n\n");}

下沉和上浮交替进行的双向起泡排序:

#include<stdio.h>void BubbleSort(int *array, int n) {    int boundmin = 0;    int boundmax = n;    int mmin, mmax, i;    int a;    while (boundmin < boundmax) {        mmin = 0;        mmax = 0;        for (i = boundmin; i < boundmax; i++) { //下沉            if (*(array + i) > *(array + i + 1)) {                a = *(array + i);                *(array + i) = *(array + i + 1);                *(array + i + 1) = a;                mmax = i;   //记录下沉最后一次交换的位置            }        }        if (mmax == 0)            break;        boundmax = mmax;        for (i = boundmax - 1; i > boundmin; i--) { //上浮            if (*(array + i) < *(array + i - 1)) {                a = *(array + i);                *(array + i) = *(array + i - 1);                *(array + i - 1) = a;                mmin = i;   //记录上浮最后一次交换的位置            }        }        if (mmin == 0)            break;        boundmin = mmin;    }}void main() {    int array[9] = { 36,80,15,26,33,2,96,46,83 };    int i;    printf("待排序数组:");    for (i = 0; i < 9; i++) {        printf("%d ", *(array + i));    }    getchar();    BubbleSort(array, 9);    printf("\n排序后的数组:");    for (i = 0; i < 9; i++) {        printf("%d ", *(array + i));    }    printf("\n\n");}

时间复杂度:最好的时间为O(n);最坏时间O(n^2);平均时间复杂度O(n^2)。
空间复杂度:冒泡排序是就地排序,空间复杂度为O(1) (辅助空间为O(1))。
稳定性:冒泡排序是稳定的。

0 0
原创粉丝点击