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

  • 相关阅读:
    How Default Heap Of Process Grows
    希腊字母表
    Ubuntu第一次亲密接触
    Ubuntu中的挂载点(mount point)
    要一专多能
    First touch with JIT debugging
    小学一下环境变量
    安装VMware Tools
    [转]ReiserFS与ext3的比较
    [bbk4485]第二章Flashback Database 05
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/7227973.html
Copyright © 2011-2022 走看看