常见排序算法

(1)冒泡排序

冒泡排序就是相邻元素不断比较,一次循环之后,第一个数不用再比较,从i+1开始,如果前者大,则交换,如果某次循环没有交换数据,那么排序结束

   for(int i=0;i<n;i++)

       Swap = false;

      for(int j=n-1;j>i;j--)

      {

            if(arr[j] > arr[j-1])

             {swap=true;  交换}

      }如果swap=false,则本次循环没有交换,排序结束

   可以看出,相等元素是不会进行交换的,即使不相邻,他们也不会,所以它是一个稳定的排序算法

(2)选择排序

选择排序是每次选择出第i小的元素,放到第I个位置上

for(int i=0;i<n;i++)

{  small = arr[i]

   for(int j=i+1;j<n;j++)

   {  if(arr[j] < small)   small = arr[i]; index = j}

   arr[i] = small; arr[index] = arr[i]

}

  当一个小的元素,在2个大的相等元素的后边,那么选择最小值后,交换了小的和前面的那个大数,破坏了稳定性

(3)插入排序 
插入排序是从第2个开始,不断和前面的元素比较,比他大就往后移,第i个元素前面的序列是有序的。碰到比他小的数后,给小数后面的那个数赋值

for (int i=1;i<n;i++)

{   tmp=arri[i]

     for(j = i;j>=1;j--)

     if(tmp < arr[j] )  arr[j] = arr[j-1]  else break;

     arr[j+1] = tmp;

}  相等元素不会交换,它是稳定排序

(4)快速排序 
快速排序选择一个轴值,比他小的放左边,比他大的放右边,轴值可能与几个数相等,且位于这几个数相对位置的中间,那么必定会调整其他几个放到左边或者右边,

  所以快排不是一个稳定的算法

(5)归并排序 
归并排序是把序列递归的分成两部分,小序列不断归并,相等元素相对位置没有改变,它是稳定的排序算法

(6)堆排序 
堆排序首先要建堆,也就是从最后一个不是叶子结点的结点开始,向下调整,然后堆顶和最后一个数交换,也就是出堆,堆顶向下调整

因为堆的父结点不大于子结点,有可能父节点与一个子结点相等,另一个子结点大,出堆后父节点放到了数组尾部,改变了相对位置,所以堆排序不稳定

posted on 2014-12-10 15:04  cxzhi  阅读(105)  评论(0编辑  收藏  举报

导航