七大排序

**********

 交换排序

**********

 

1.冒泡排序

 

思想:

n-1轮交换操作,交换是相邻项交换,一轮遍历就在最后面

成功交换出来一个最值了,后面得到的最值在下一轮中就不用管了。

#include <iostream>

using namespace std;

int main()

{

int a[10]={2,1,4,6,4,7,9,8,3,5};

for(int i=0;i<9;i++)                   //需要交换的轮数    

        {

     for(int j=0;j<10-1-i;j++)       //从数组起始一直到已经交换出的数为止, 

         {                     //涉及到j+1,只需要到“当前末位置”前一个

          if(a[j]>a[j+1])            

              {

                  int t=a[i];a[i]=a[j];a[j]=t;

    }

}      

}

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

   cout<<a[i]<<' ';

cout<<endl;

}

 

 

 

2.快速排序

 

思想:

left位置取数作为基准(base)参照物,

从数组的right位置向前找,一直找到比(base)小的数,如果找到,将此数赋给left位置,

从数组的left位置向后找,一直找到比(base)大的数,如果找到,将此数赋给right的位置,

重复“第二,第三“步骤,直到leftright指针重合,最后将(base)插入到指针重合的位置,

第一遍的遍历完成(让leftright指针重合),数组出现切割点(切割点一边的数全小于分割点,一边全大于)

然后对分割点两边继续进行分割,递归操作直到不能分割,排序完成。

代码实现:

递归操作,递归出口是数组左右指针重合;

充分利用了while循环的好处。

#include <iostream>

using namespace std;

void quicksort(int a[],int low,int high)       //lowhigh参数指数组需要排列的首项和尾项

{

if(low<high)                              //递归条件(出口)                

   {

        int i=low,j=high,temp=a[i];

        while(i<j)                        //操作出口条件

            {

             while(a[j]>=a[i]&&j>i)    //右指针左移动直到能赋值

                 j--;

                a[i]=a[j];

                while(a[i]<=a[j]&&i<j)    //左指针右移动直到能赋值

                    i++;

                a[j]=a[i];

}

a[i]=temp;                      //一轮遍历完成,i==j,赋基准值。

quicksort(a,low,i-1);           //对分割点前面数据进行递归操作

quicksort(a,i+1,high);          //对分割点后面数据进行递归操作

   }

else return;

}

int main()

{

int a[10]={2,1,4,6,4,7,9,8,3,5};

quicksort(a,0,9);

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

   cout<<a[i]<<' ';

cout<<endl;

}

 

 

 

**********

 选择排序

**********

不断找最值,直到完成排序。

对求前K大问题很好。

 

 

3.直接选择排序

 

思想:

对前n-1个数进行操作,

与他后面所有的数进行比较,比他大或者小就交换。

相当于每次找最值置于最前面。

 

#include <iostream>

using namespace std;

int main()

{

int a[10]={2,1,4,6,4,7,9,8,3,5};

for(int i=0;i<9;i++)                    //需要交换的数,只要到倒数第二个

    {

     for(int j=i+1;j<10;j++)         // 需要交换的数后面开始一直到最后

         {

          if(a[i]>a[j])            

             {

                  int t=a[i];a[i]=a[j];a[j]=t;

   }

}      

}

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

   cout<<a[i]<<' ';

cout<<endl;

}

 

 

 

4.堆排序

要知道堆排序,首先要了解一下二叉树的模型。

那么要实现堆排序,必须要做两件事情:

第一:构建大根堆。

第二:输出大根堆。

 

 

 

**********

其他排序

**********

 

5.插入排序:

  直接插入和折半插入

6.希尔排序

7.归并排序

ps: 插入排序的时间复杂度为:O(N^2)

     希尔排序的时间复杂度为:平均为:O(N^3/2)

                                       最坏: O(N^2)

     归并排序时间复杂度为: O(NlogN)

              空间复杂度为:  O(N) 

 

posted on 2017-08-17 16:11  bigganbing  阅读(211)  评论(0编辑  收藏  举报