zoukankan      html  css  js  c++  java
  • 排序算法

    算法思想

    冒泡排序分为趟数和交换次数。

    外层循环为趟数,如果有n个元素则要循环n-1趟。

    内层循环主要做每一趟的交换,从第0个元素开始如果发现当前元素大于它的后一个元素,将其交换,每一趟下来,最后一个元素都是最大的,所以每次循环只要循环到0~n-1-i即可,因为后面的元素就是有序的了。

    算法代码

    void BubbleSort(int* arr,int size)
    {
    	int k=size-1;	//k用来记录每趟排序的最大的交换位置
        int pos=0;	//pos记录最后一次交换的位置
    	//排序的趟数,共size-1次 
    	for(int i=0;i<size-1;i++)
    	{
    		//每一趟前都将flag标志先置为0 
    		int flag=0;
    		//每一趟排序都是从0~k,k初始是size-1,之后随着循环k值可能变化 
    		for(int j=0;j<k;j++)
    		{
    			if(arr[j]>arr[j+1])
    			{
    				int temp=arr[j];
    				arr[j]=arr[j+1];
    				arr[j+1]=temp;
    				flag=1;	//元素发生了交换,flag置为1 
    				pos=j;	//pos存放循环里最后一次交换的位置j 
    			}
    		}
    		k=pos;	//下一内层循环仅循环到0到这次得到的k之间 
    		//如果一趟下来flag没有变化,即元素本来就是有序,就直接return 
    		if(flag==0)
    		{
    			return;
    		}
    	}
    }

    此算法是冒泡排序的优化版算法,优化点:

    1.如果本来就有序,第一趟就直接判断然后return。

    2.每一趟都是从0~k,可以记住上一趟排序时最后一次交换的位置k值,下一次的k值会更新,如果中间有几个元素本来就有序,则k值记录的是有序的前一个位置,则下一次循环就不用再循环这几个元素,直接循环到记录的k值那里即可,可以减少循环次数。

    算法分析

    最好的情况(关键字在记录序列中正序):只需进行一趟冒泡

    比较的次数:n-1

    移动的次数:0

    最坏的情况(关键字在记录序列中反序):需进行n-1趟冒泡

    比较的次数:

    4c3dfcdd-e813-4e45-bf74-86453a9d8509

    移动的次数:

    45ca3388-44a3-4acc-bf6f-2a1dce04ebff

    所以冒泡排序最好时间复杂度为O(n),最坏和平均为O(n^2)。

  • 相关阅读:
    红黑树深入剖析及Java实现
    Innodb中的事务隔离级别和锁的关系
    从实际案例聊聊Java应用的GC优化
    Java HotSpot VM Options 参数设置
    jvm 字节码查看
    JDK8-废弃永久代(PermGen)迎来元空间(Metaspace)
    jsp 预编译
    MySQL中有关TIMESTAMP和DATETIME的总结
    MySQL 索引及优化实战
    spring boot 配置https 报这个错误:java.lang.IllegalArgumentException: Private key must be accompanied by certificate chain
  • 原文地址:https://www.cnblogs.com/WindSun/p/11069233.html
Copyright © 2011-2022 走看看