【通俗易懂-动态图解析】冒泡排序、选择排序

原创: 编程小兔崽 编程小兔崽 10月24日

 

冒泡排序

 

冒泡排序算法的原理如下:

1:比较相邻的元素。如果第一个比第二个大,就交换他们两个。

2:对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

3:针对所有的元素重复以上的步骤,除了最后一个。

4:持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

 

 

C语言实现:

#include<stdio.h>

 

void swapSort(int *a, int count);

void showArray(int *a, int count);

 

void showArray(int *a, int count){

    int i;

 

    for(i = 0; i < count; i++){

        printf("%d ", a[i]);

    }

 

    printf("\n");

}

 

void swapSort(int *a, int count){

    int i;

    int j;

    int tmp;

 

    for(i = 0; i < count; i++){

        for(j = 0; j < count-i; j++){

            if(a[j] > a[j+1]){ //将大的数字放在最后面

                tmp = a[j];

                a[j] = a[j+1];

                a[j+1] = tmp;

            }

        }

    }

}

 

void main(void){

    int a[] = {3, 5, 7, 9, 1, 6, 10};

    int count = sizeof(a)/sizeof(int);

 

    swapSort(a, count);

    showArray(a, count);

}

 

C++语言实现:

 

#include <iostream>

 

using namespace std;

 

void print(int a[], int n ){  

cout<<n <<":";  

for(int j= 0; j<n; j++){  

cout<<a[j] <<" ";  

}  

cout<<endl;  

}  

 

 

void InsertSort(int a[], int n)  

{  

for(int i= 0; i < n; i++)

{

int tmp = 0;

for (int j = i+1; j < n; j++)

{

if (a[i] > a[j])

{

tmp = a[i];

a[i] = a[j];

a[j] = tmp;

}

}

print(a,n);

}  

}  

 

int main(){  

int a[9] = {3,1,5,7,2,4,9,6,2};  

InsertSort(a,9);  

print(a,9);  

 

时间复杂度O(n^2);

 

选择排序

 

依次是下标为(0,1,2,....n)的数字和其后的所有数字进行比较,每一轮的比较结果:都先确定最前面的是最小的数字;

 

 

C语言实现:

 

#include<stdio.h>

 

void sort(int *a, int count);

void showArray(int *a, int count);

 

void showArray(int *a, int count){

    int i;

 

    for(i = 0; i < count; i++){

        printf("%d ", a[i]);    

    }

    printf("\n");

}

 

void sort(int *a, int count){

    int i;

    int j;

    int tmp;

 

    for(i = 0; i < count; i++){

        for(j = i+1; j < count; j++){

            if(a[i] > a[j]){

                tmp = a[i];

                a[i] = a[j];

                a[j] = tmp;

            }

        }

    }

}

 

void main(void){

    int a[] = {3 ,5 ,6, 1, 7, 2, 9, 8};

    int count = sizeof(a)/sizeof(int);

 

    sort(a, count);

    showArray(a, count);

}

 

C++语言实现:

 

#include<iostream>

using namespace std;

 

void print(int a[], int n)

{  

    for(int j= 0; j<n; j++)

{  

        cout<<a[j] <<"  ";  

    }  

    cout<<endl;  

}

 

void selectSort(int a[], int len)

{

 

int minindex, temp;

for(int i = 0; i<len-1;i++)

{

    minindex = i;

    for(int j = i+1; j<len; j++)

{

    if(a[j]<a[minindex])

minindex = j;

 

}

temp = a[i];

a[i] = a[minindex];

a[minindex] = temp;

}

}

 

int main()

{  

    int a[10] = {8,1,9,7,2,4,5,6,10,3};  

    cout<<"初始序列:";  

    print(a,10);  

    selectSort(a,10);  

    cout<<"排序结果:";  

    print(a,10);  

    system("pause"); 


时间复杂度为O(n^2);

 

 

 

喜欢本文的朋友们,欢迎长按下图关注

订阅号编程小兔崽,收看更多精彩内容

每天进步一点点,如果有用给小编点个

 

 

 

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 冒泡排序是一种排序算法,它重复地走访过要排序的数列,一次比较两个元素,如果顺序错误就把它们交换过来。简单来讲,就是把小的数往前放,把大的数往后放。比如有一个数组[6,3,8,2,9],冒泡排序的过程就是先比较6和3,6大于3,就把6和3的位置调换,变成[3,6,8,2,9];接着比较6和8,6小于8,就不用调换位置,变成[3,6,8,2,9];然后比较8和2,8大于2,就把8和2的位置调换,变成[3,6,2,8,9];最后比较8和9,8小于9,不用调换位置,变成[3,6,2,8,9]。这样,一次完整的冒泡排序就结束了。 ### 回答2: 冒泡排序是一种简单的排序方法,可以将一组数字按照顺序排列。我们可以用一个通俗的例子来解释冒泡排序:假设有一个班级有5名同学,他们的成绩分别是78、82、93、65、88,现在需要按照从小到大的顺序排列他们的成绩。 冒泡排序的思路是从第一个同学开始,逐个比较相邻的两个同学的成绩,如果前一个同学的成绩比后一个同学的成绩大,则交换他们的位置。这样一轮比较下来,最大的成绩会像气泡一样浮到最后面。 首先,我们从第一个同学78开始,与下一个同学82进行比较。因为78小于82,所以不需要交换位置,继续比较。然后是82与93进行比较,因为82小于93,同样不需要交换位置。接下来是93与65进行比较,因为93大于65,所以需要交换位置,此时的顺序变成了78、82、65、93、88。继续比较下去,88与93进行比较,因为88小于93,不需要交换。 第一轮比较结束后,最后一个同学的成绩93就像气泡一样浮到了最后面。然后,我们再从第一个同学开始进行第二轮比较,但是这次只需要比较前4个同学的成绩,因为最后一个同学的成绩已经是最大的,不需要再进行比较。 在第二轮比较中,我们可以发现82和65需要交换位置,因为82大于65。经过第二轮比较后的顺序为78、65、82、88、93。 然后再进行第三轮比较,发现78和65需要交换位置,经过第三轮比较后的顺序为65、78、82、88、93。 经过三轮比较,我们得到了按照成绩从小到大排列的顺序,即65、78、82、88、93。 这个例子就是冒泡排序的一个通俗解释。通过多轮比较和交换位置,最大的元素逐渐“浮”到最后面,实现排序的目的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值