基础算法-冒泡排序

来源:互联网 发布:主播过度劳累猝死知乎 编辑:程序博客网 时间:2024/05/25 18:11

冒泡排序:

思想:数组分为左右两部分,无序区,和有序区,开始数全在无序区,有序区长度为0

从无序区开始位置到无序区结束位置遍历,相邻的两个数相互比较,如果当前的数比它后面的数大,那么就交换他们的位置,这样第一遍后,就将最大的数放到了无序区最后面的位置,此时也就是数组的最后面,现在有序区有一个数,

然后第二遍遍历则把无序区剩下的数的最大值交换到了此时无序区最后面的位置,也就是数组的倒数第二个位置,这样每次把无序区间剩余数的最大值交换到无序区的最后面,与之前有序区构成新的有序区。

这里对于[5 4 2 3 1]模拟一遍过程
[5 4 2 3 1][]
[4 5 2 3 1][]
[4 2 5 3 1][]
[4 2 3 5 1][]
[4 2 3 1 5][]


[42 3 1][5]


[2431][5]

[2 3 4 1][5]
[2 3 1 4][5]


[2 3 1][4 5]


[2 3 1][4 5]
[2 1 3][4 5]


[21][3 4 5]

[1 2][3 4 5]
[1][2 3 4 5]

最后[1 2 3 4 5]

#include "array.h"void isortcpp(int a[],int n){    //对于长度为n的数组来说,执行n-1次后,就将前n-1大的数排好序了,只剩最小的一个数,所以遍历n-1次就够了    for(int i=0;i<n-1;i++)        //对于第i次遍历,当前有序区的长度为i,那么n-i就是无序区结束位置,每次把当前的数和后一个位置比较,        //那么到n-i-1时就已经把最大值交换到了无序区最后面了        for(int j=0;j<n-i-1;j++)            if(a[j]>a[j+1])                swap(a[j],a[j+1]);}void isort(int a[],int n){    for(int i=0;i<n-1;i++){        for(int j=0;j<n-i-1;j++){            int t=a[j];            a[j]=a[j+1];            a[j+1]=t;        }    }}int main(){    int a[10];    getRandArray(a,10);    print(a,10);    isort(a,10);    print(a,10);}

0 0
原创粉丝点击