1.冒泡排序

冒泡排序就是通过对比前一个和后一个数的大小,按照规则进行顺序的调换。每一轮对比之后最大或者最小值都会浮到最上面或者沉到最低下。

如:对这一数组进行冒泡排序:int a[5]{34,12,56,4,7};   假设为从小到大排序

一共需要比较length-1轮:

第一轮:  a.34和12比较,12比34小,那么调换位置,此时为:12,34,56,4,7,然后在对该序列进行排序

      b.然后就是34和56进行对比,34比56小,不用调换顺序,此时依旧为:12,34,56,4,7,然后在对该序列进行排序

      c.然后再就是56和4鸡西宁对比,4比56小,所以将56和4调换顺序,此时序列就是:12,34,4,56,7

      d.再然后就对比56和7,7比56小,所以将二者位置进行调换,此时完成第一轮调换,序列为:12,34,4,7,56

    我们可以看到第一轮排序之后,已经将序列中的最大值沉到最底部了。

第二轮:此时的排序此时交第一轮要减1,

      a.先是12和34对比,前者比后者小,所以不用调换位置,序列时:12,34,4,7,56

      b.然后比较34和4的大小,后者比前者小,所以调换位置,此时序列为:12,4,34,7,56

      c.再然后比较34和7的大小,后者比前者小,所以调换位置,此时序列为:12,4,7,34,56

      d.此时就不用在往下比较了,因为比较次数已经减1了,也是因为第一轮中已经将最大的数选出来了。

然后就是第三轮和第四轮的比较,方法类似。

最终结果就是4,7,12,34,56

我们可以看到程序截图如下图所示:

2.选择排序

选择排序的实现要比冒泡排序简单一些,但是在代码上相对会有些绕。原理就是先假设待排序的序列中的第一个数为最小值或者最大值,这里还是用从小到大的顺序进行排序。首先假设第一个数为最小值(假设该值的索引下标时i),然后从该值的下一个数也就是索引为i+1的数开始进行比较,如果i+1的值要比假设的最小值小,那么就将二者的值进行交换,每一轮将最小值选择出来,并将其与假设的最小值进行调换就行,不需要想冒泡排序那样整个需略都要跟着一起移动。此时还需要一个缓冲变量来存放最小值的索引值。

详细讲解:

在时间复杂度上,这两种排序方法都是一样,O(N^2),也是需要循环执行length-1轮。还是假设对数组a进行排序。

首先定义数组:int a[5]{34,12,56,4,7};

第一轮:先假设序列中的第一个数是最小值,记录下它的索引值,定一个新的变量用来存放该索引值,minIndex=0,下表为0也就是第一个数。然后在进行循环。

      a.内循环中的第一轮是34和12进行比较,后者比前者小,所以将minIndex的索引值进行更改,此时minIndex=1,

      b.内循环中的第二轮,是利用minIndex 中的数和下一个待比较的数进行比较,应该是12和56比较,后者比前者小,所以不用修改minIndex的值

      c.内循环中的第三轮,还是利用索引为1的数值和下一个待比较的数进行比较,应该是12和4进行比较,后者较之前者较小,所以记录下当前数的索引值并赋值给minIndex,此时minIndex=3

      d.内循环中的第四轮,利用minIndex索引值的数值和下一个待比较的数进行比较,应该是4和7进行比较,后者比前者大,所以不用修改minIndex的值

    然后将序列中的第i个数和序列中索引值为minIndex的数进行调换,第一轮已将最小值选择出来了。此时序列为:4,12,56,34,7

    第一轮外循环之后,minIndex=3,下一轮外循环会将这个值直接覆盖

第二轮:此时的minIndex=1,假设的最小值是12

     此时定义上一轮外循环的下一个数为最小值,也即是索引值为1的值,那么本轮循环将从索引值为2的数开始比较,

      a.内循环中的第一轮,比较12和56,后者比前者大,所以不用修改minIndex的值,

      b.内循环中的第二轮,此时比较12和34的大小,还是依旧不用修改索引值

      c.内循环中的第三轮,此时比较12和7的大小,后者比前者小,索引记录下当前数的索引值并赋值给minIndex记录下来

    内循环结束,判断minIndex的值是否被改变,如果被改变了,那么就将下标为i的数和下标为minIndex的数进行交换。此时序列为:4,7,56,34,12且minIndex=4

第三轮和第四轮外循环的规则类似。。

我们可以看程序运行的效果图如下:

最后附上可供运行的c++代码:

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{

    // bubble sort
    double a[5]={34,12,56,4,7};
    int len = sizeof(a) / sizeof(double);

    //output all numbers
    cout << "before sorted by bubbleSort:" <<endl;
    for (int i=0;i<len;i++)
    {
        cout << a[i]<<"\t";
    }
    cout << endl;

    //start to sort the array
    for (int i=0;i<len-1;i++)
    {
        for(int j=0;j<len -i -1;j++)
        {
            if(a[j]>a[j+1])
            {
                double t = 0;
                t = a[j];
                a[j] = a[j+1];
                a[j+1] = t;
            }
        }
        cout << "This is at NO." << i << "time:    ";
        for(int i=0;i<len;i++)
            cout << a[i] << "\t";
        cout << endl;

    }

    //output after sorted
    cout << "after sorted by bubbleSort:"<<endl;
    for (int i=0;i<len;i++)
    {
        cout << a[i]<<"\t";
    }
    cout << endl;

    //selectsort
    double b[5]={34,12,56,4,7};

    cout << "before sorted by selectSort:" << endl;
    for (int i=0;i<len;i++)
    {
        cout << b[i]<< "\t";
    }
    cout << endl;
    //start to selectSort
    for(int i=0;i<len-1;i++)
    {
        int minIndex = i;//pretend the first number of the array be the min number.and record the index
        cout << "ending->minIndex=" << minIndex << endl;
        for (int j=i+1;j<len;j++)
        {
            if(b[minIndex]>b[j])
            {
                minIndex = j;
            }
        }
        if(minIndex != i)
        {
            double t = 0;
            t = b[i];
            b[i] = b[minIndex];
            b[minIndex] = t;

        }
        //print the detail
        cout << "This is at NO." << i << "time:  ";
        for(int i=0;i<len;i++)
            cout << setw(4)<<b[i] ;
        cout << "   "<< "ending->minIndex=" << minIndex << endl;

    }
    cout << "after sorted by selectSort:" << endl;
    for (int i=0;i<len;i++)
    {
        cout << b[i]<<"\t";
    }
    cout << endl;

    return 0;
}

  

c++之选择排序和冒泡排序实现的更多相关文章

  1. 算法——蛮力法之选择排序和冒泡排序c++实现

    这次实现的是蛮力法中的两个例子,选择排序法和冒泡排序法,使用的编译环境是vs2013,下面对这两个算法做一个简单介绍,然后是两个算法的c++实现代码. 选择排序法比较的范围是整个列表,每次扫描结束找出 ...

  2. java 选择排序、冒泡排序、折半查找

    public class SortAndSelectDemo{ public static void main(String[] args){ int[] arr = {3, 5, 17, 2, 11 ...

  3. C语言排序算法之简单交换法排序,直接选择排序,冒泡排序

    C语言排序算法之简单交换法排序,直接选择排序,冒泡排序,最近考试要用到,网上也有很多例子,我觉得还是自己写的看得懂一些. 简单交换法排序 /*简单交换法排序 根据序列中两个记录键值的比较结果来对换这两 ...

  4. Java-数据结构与算法-选择排序与冒泡排序

    Java 选择排序与冒泡排序 1.DataSorter.java public class DataSorter { //冒泡排序法 //主要思路:按升序排序,数组元素两两比较,大的立即排后面 pub ...

  5. java 选择排序与冒泡排序

    选择排序与冒泡排序的特点与区别 ++++++++++++++++++++++++++++++++++++++++++++++ 选择排序 这一种简单的排序方法,它的基本思想是:R[n]第一次从R[0]~ ...

  6. 【java基础】选择排序and冒泡排序

    前言 : 今天学习的是J2SE视频里的第五章,数组部分,它里面留了一个经典的作业,就是让我们去从1倒9按一定规格排序,这让我想起了学习vb的时候最最让我头疼的两种排序方法,选择排序法 和 冒泡排序法. ...

  7. 关于Java中的选择排序法和冒泡排序法

    一,这种方法是直接传入一个数组进行排序(选择排序法) public static void selectSort(int arr[]){ for (int i = 0; i < arr.leng ...

  8. C#算法 选择排序、冒泡排序、插入排序

    1.冒泡排序: 方法一: public static int[] MaoPao(int[] arr) { //执行多少次 for (int i = 0; i < arr.Length; i++) ...

  9. Java中选择排序,冒泡排序,插入排序,快速排序

    一:冒泡法排序  //冒泡排序 注:从小到大排   //特点:效率低,实现简单  //思想:每一趟将待排序序列中最大元素移到最后,剩下的为新的待排序序列,重复上述步骤直到排完所有元素. 这只是冒泡排序 ...

  10. 基本的排序算法C++实现(插入排序,选择排序,冒泡排序,归并排序,快速排序,最大堆排序,希尔排序)

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/8529525.html特别不喜欢那些随便转载别人的原创文章又不给 ...

随机推荐

  1. oracle 求班级平均分

    select * from ( selectclass 班级,subject,avg(grade) avg_gradefrom student_score group by class,subject ...

  2. 「这样玩Hexo」修改主题自定义实现界面和功能的自定义

    首发于个人博客 想获得更好的阅读体验,烦请移步⬆️ 前言 作为一个颜党,在换了许多Hexo的主题后,选择了现在使用的fexo主题.但是相比于大多数博主使用的NEXT,fexo还是不够powerful, ...

  3. N 秒打开一个新窗口

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  4. sql批量插入添加自动编号

    使用: ROW_NUMBER() over(order by ID desc) insert into dbo.Aa(Name,Nums) select top 10 NickName,ROW_NUM ...

  5. [Selenium] Java代码获取屏幕分辨率

    import java.awt.Dimension; import java.awt.GraphicsEnvironment; import java.awt.Insets; import java. ...

  6. MyEclipse不能自动编译解决办法总结

    yEclipse在debug模式下,有时会碰到修改的文件无法自动编译的问题,以下的方法可以逐一尝试一下. 1.确保:Project->build automatically 已经被选上. 2.p ...

  7. 15 Independent Alleles

    Problem Figure 2. The probability of each outcome for the sum of the values on two rolled dice (blac ...

  8. nginx 集群介绍

    nginx 集群介绍 完成一次请求的步骤 1)用户发起请求 2)服务器接受请求 3)服务器处理请求(压力最大) 4)服务器响应请求 缺点:单点故障 单台服务器资源有限 单台服务器处理耗时长 ·1)部署 ...

  9. java分页实例Demo

    前两天测试过的一个分页的demo,在网上看到的,挺好的,就写了下来. 分页也是web里面必须的,有使用的价值. demo文件打包上传了,链接:http://pan.baidu.com/s/1o6sME ...

  10. gearman服务连接php java

    在实际工作中,会碰到两个问题 (1)现有系统想集成一个开发组件,而该组件的SDK却没有现有语言版本. (2)系统中的一项功能非常耗费资源,最好能利用其它机器来处理. 本文介绍gearman的使用,实现 ...