• 简单排序:冒泡、选择、插入


    1,冒泡排序。

    冒泡排序的原理很形象,就像是气泡,轻的往上浮的过程,直到气泡都按轻重排列。

    那么算法中,如果我们用数组来存放元素,要对数组的每个元素进行向上冒泡。

    a,伪冒泡排序

    void Bubble(int *data,int length)
    {
      for(int i=0;i<length;i++)//每个元素进行冒泡
      {
               for(int j=length-1;j>=0;j--)//每个元素与上一个元素进行对比
               {
                      if(data[i]<data[j])//冒泡,向上交换数据
                      {
                           int temp=data[i];
                           data[i]=data[j];
                           data[j]=temp;
                       }
               }
      }
    }
    

    为什么说是伪冒泡呢?请注意第二个循环 for(int j=length-1;j>0;j--),

    如果是第一趟,冒泡到最上层;

    如果是第二趟,按道理最上层就不需要冒泡了,因为第一冒泡的时候最上层的已经是最小了。

    ……

    所以我们需要改变我们的代码:

    b,冒泡排序

    void Bubble(int *data,int length)
    {
      for(int i=0;i<length;i++)//每个元素进行冒泡
      {
               for(int j=length-1;j>=i;j--)//冒过泡的就代表有序了,所以不需要继续冒泡了
               {
                      if(data[i]<data[j])//交换数据
                      {
                           int temp=data[i];
                           data[i]=data[j];
                           data[j]=temp;
                       }
               }
      }
    }
    

    那么是否有改进的地方呢?考虑一个问题,当冒泡的时候上一趟冒泡如果没有交换数据,说明数据已经有序了,那么对下一趟排序就没有必要了。

    C,优化的冒泡排序

    void Bubble(int *data,int length)
    {
        bool flag=true;
      for(int i=0;i<length&&flag;i++)//每个元素进行冒泡
      {
              flag=false;
               for(int j=length-1;j>=i;j--)//冒过泡的就代表有序了,所以不需要继续冒泡了
               {
                      if(data[i]<data[j])//交换数据
                      {
                           int temp=data[i];
                           data[i]=data[j];
                           data[j]=temp;
                           flag=true;//需要进行排序
                       }
               }
      }
    }    
    

    2,选择排序。

    选择排序是指依次把最小的元素找出来的一种方法。

    void selectSort(int *data,int length)
    {
    	int min;
    	for (int i=0;i<length;i++)//个数
    	{
    		min=i;
    		for (int j=i+1;j<length;j++)
    		{
    			if (data[min]>data[j])//每趟都找出最小数,放在i处
    			{
    				min=j;
    			}
    		}
    		if (min!=i)//如果相同则i处最小
    		{
    			int temp=data[i];
    			data[i]=data[min];
    			data[min]=temp;
    		}
    		
    	}
    }
    

    3,插入排序。

    插入排序是指对已经有序的序列插入一个新元素后,对序列进行排序,序列增加1。重复这个过程,直到序列都有序。

    void insertSort(int *data,int length)
    {
    	//插入排序的思想是,对已经有序的序列插入一个新的元素,使得新序列增加1
    	//首先列表为第一元素。
    	for(int i=1;i<length;i++)//所以从第二个元素开始插入排序
    	{
    		if (data[i-1]>data[i])
    		{
    			int temp=data[i];
    			int j;
    			for (j=i-1;data[j]>temp;j--)//对有序列表内进行插入
    			{
    				data[j+1]=data[j];//元素后移动
    			}
    			data[j+1]=temp;//插入元素
    		}
    		
    	}
    }
    

    总结,这三种排序的时间复杂度都是O(n*n),效率也依次递增。

     

  • 相关阅读:
    《架构真经》读后感2
    css的引入
    交流会发言
    css学习
    数据结构-哈希表、二叉排序数
    软工人学习日常
    Java包、类、方法、变量、常量命名规范
    数据库命名规范
    学生信息系统jsp界面
    学生信息系统servlet层
  • 原文地址:https://www.cnblogs.com/273809717/p/2835126.html
Copyright © 2020-2023  润新知