zoukankan      html  css  js  c++  java
  • 若干排序算法简单汇总(一)

    转载请注明出处

    http://blog.csdn.net/pony_maggie/article/details/35819279


    作者:小马


    从题目看,首先不是所有是若干。

    排序算法非常多。我个人的能力也有限。不可能都讲到。另外,是简单汇总,是希望能用最简单的代码,最简短的语言说明问题,不搞太多理论分析。

    就像前面说的。排序算法有非常多,并且不存在哪一种最不好。哪一种最好这种说法。依据用途不同选择最适合的即可了。只是仅从时间复杂度来看。基本上有两种。一种是O(n^2), 一种是O(nlogn)。

    所谓的时间复杂度,事实上是基于多少次基本操作定义的,在排序算法中,基本操作指两类,一是比較,二是记录从一个位置移动还有一个位置

    以下讲到的排序算法都会涉及到这些操作。

    一直接插入排序

    先从一个最简单的切入。它的思种是这种。把一个数插入到已排好的序列中。比方已有一个有序序列:

    { 12, 23, 25, 40}

    如今有一个数18要插入进来,而且保证插入后序列还是有序。18開始和序列中的全部数逐一比較(从右向左比較),比40小。40后移,比25小,25后移,比23小,23后移。跟12比,发现比12大,停在这里,插入到23的位置,终于变为:

    { 12, 18, 23, 25, 40}

    上面的过程叫一趟插入排序,基于这个思想, 我们能够觉得数组第一个元素是有序的。所以能够从第二个元素開始。每一个元素都做一趟插入排序就能够得到一个有序序列。代码就非常easy了,

    int insertSort(int nArray[], int nLength)
    {
    	int i = 0;
    	int j = 0;
    	int nSerity = 0;//备份要插入的那个元素
    
    	for (i = 1; i < nLength; i++)
    	{
    		if (nArray[i] < nArray[i-1])
    		{
    			nSerity = nArray[i];
    			nArray[i] = nArray[i-1];
    			for (j = i-2; (j >= 0)&&(nSerity < nArray[j]); j--)
    			{
    				nArray[j+1] = nArray[j];
    			}
    			nArray[j+1] = nSerity;
    		}
    	}
    	return 0;
    }
    非常easy看出它的时间复杂度是O(n^2)

    二冒泡排序

    这个排序算法基本是大学老师必讲的。由于它除了简单之外,也确实比較好玩。思路是这种。一个无序序列a[n], a[1]和a[2]比較,假设a[1]>a[2], 它们就交换位置。否则不做处理。继续a[2]和a[3]相同的原理比較,一直到a[n-1]和a[n]比較。

    上面的过程叫一趟冒泡,请你在脑海里想像下这个过程。我以下要说的这个结论希望你能想明确,那就是经过一趟冒泡后,序列中最大的那个元素已经被换到a[n]的位置了。

    有没有认为这个过程就像冒泡一样,仅仅只是这个泡是向下冒的。

    做第二趟冒泡时,仅仅要对a[1]~a[n-1]操作即可了。结果是序列中第二大的那个元素在a[n-1]的位置了。

    然后经过n趟冒泡后,排序就完毕了。

    通过上面的过程也非常easy得出冒泡排序的时间复杂度是O(n^2)。能够上代码了,

    //bChange作用是为了对于已排好序的序列,能
    //及时退出来。
    int bubbleSort(int nArray[], int nLength)
    {
    	int i = 0;
    	int j = 0;
    	int nTemp = 0;
    
    	bool bChange = true;
    	for (i = 0; (i < nLength) &&(bChange); i++)
    	{
    		bChange = false;
    		for (j = 0; j < (nLength - i - 1); j++)
    		{
    			if (nArray[j] > nArray[j+1])
    			{
    				nTemp = nArray[j];
    				nArray[j] = nArray[j+1];
    				nArray[j+1] = nTemp;
    				bChange = true;
    			}
    		}
    	}
    
    	return 0;
    }
    能够好好理解一下代码中bChange变量的作用,这里不多说解释了,留给大家思考。


    这篇就打算写这么多了,主要篇幅太长怕大家看着厌烦,过几天有空了再接着写吧。

    代码下载地址:

    http://download.csdn.net/detail/pony_maggie/7568971

    https://github.com/pony-maggie/SortDemo

  • 相关阅读:
    Java 第十一届 蓝桥杯 省模拟赛 洁净数
    Java 第十一届 蓝桥杯 省模拟赛 第十层的二叉树
    Java 第十一届 蓝桥杯 省模拟赛 第十层的二叉树
    Java 第十一届 蓝桥杯 省模拟赛 第十层的二叉树
    Java 第十一届 蓝桥杯 省模拟赛 70044与113148的最大公约数
    Java 第十一届 蓝桥杯 省模拟赛 70044与113148的最大公约数
    20. Valid Parentheses
    290. Word Pattern
    205. Isomorphic Strings
    71. Simplify Path
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/7227973.html
Copyright © 2011-2022 走看看