排序算法

1 并归排序: 将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个有序的子序列,再把有序的子序列合并为整体有序序列。

    算法如下:
         第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
         第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置
         第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
         重复步骤3直到某一指针超出序列尾
         将另一序列剩下的所有元素直接复制到合并序列尾

2 位图排序: 对输入的数据是有比较严格的要求(数据不能重复,大致知道数据的范围)。位图排序即利用位图或者位向量来表示集合

    算法如下:

        1.根据需要排序的输入中最大和最小的数,设置byte型的数组(为什么不是bit型呢?因为计算机处理的最小单元就是byte..1byte=8bit),设置所有位为0。

        2.依次读取输入,某一次读取数据是,在数组那一位设置1,表示包含这个数。

        3.读回,遍历byte数组,如果某一位是1,就表示包含这个数。

3 插入排序: ,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序

     算法如下:  

        1. 从第一个元素开始,该元素可以认为已经被排序
       ⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描
       ⒊ 如果该元素(已排序)大于新元素,将该元素移到下一位置 
       ⒋ 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
       ⒌ 将新元素插入到下一位置中
       ⒍ 重复步骤2~5

4 折半插入排序: 直接插入排序在查找待排序记录位置时使用的是顺序查找,所以在有序序列中查找待插入记录的位置时可以使用折半查找法    

      算法如下:

        同3  但查找待插入记录的位置为折半查找法

5 希尔排序:  希尔排序属于插入类排序,是将整个有序序列分割成若干小的子序列分别进行插入排序

      算法如下:

       1. 先取一个正整数d1<n,把所有序号相隔d1的数组元素放一组,组内进行直接插入排序

       2. 然后取d2<d1,重复上述分组和排序操作;直至di=1,即所有记录放进一个组中排序为止

6 冒泡排序: 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成

      算法如下:

        1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。

        2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数

        3. 针对所有的元素重复以上的步骤,除了最后一个

        4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较

7 快速排序:  通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

      算法如下:

         1. 设置两个变量i、j,排序开始的时候:i=0,j=N-1;
         2. 以第一个数组元素作为关键数据,赋值给key,即key=A[0];
         3. 从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]赋给A[i];
         4. 从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]赋给A[j];
         5. 重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[j]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。

         6. 重复1~5继续快排,直到"i >= j" 跳出

8 堆排序: 利用堆积树(堆)这种数据结构所设计的一种排序算法,可以利用数组的特点快速定位指定索引的元素。堆实质上是满足如下性质的完全二叉树:树中任一非叶子结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字

       算法如下:

        1. 将初始待排序关键字序列(R1,R2....Rn)构建成大顶堆,此堆为初始的无序区
        2. 将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,......Rn-1)和新的有序区(Rn),且满足R[1,2...n-1]<=R[n];
        3. 由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,......Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2....Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。   

        堆建立刷选算法:

        1.  按现有的顺序从上到下,从左到右放到一个完全二叉树里面。然后把这个树调节成堆。调节的时候从最后一个有儿子的节点开始。 也就是从下往上,从右往左找,找到的第一个有孩子的节点开始。依次把各个节点及下面的孩子组成的树调节成堆

9. 桶排序: 桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将阵列分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递回方式继续使用桶排序进行排序)

        算法如下:

        1. 将数据按区间分为多个桶,遍历所有数据按区间将数据放入桶中

        2. 根据其他算法对桶中数据进行排序

posted on 2014-04-12 00:23  kangbry  阅读(187)  评论(0编辑  收藏  举报

导航