排序问题

来源:互联网 发布:2017社交聊天软件 编辑:程序博客网 时间:2024/05/29 17:26

1、插入排序

      (1)直接插入排序

          void InsertSort(int A[],int len)
           {
               int temp;
               for(int i=1;i<len;i++)
                  {
                      if(A[i]<A[i-1])
                        {
                           temp=A[i];
                           A[i]=A[i-1];
                           for(int j=i-2;temp<A[j];j--)
                                   A[j+1]=A[j];
                           A[j+1]=temp;  
                         }
                    }
              }


      (2)折半插入排序

          void BInsertSort(int A[],int len)
         {
              int temp;
              for(int i=1;i<len;i++)
              {
                 int low=0;
                 int high=i-1;
                 temp=A[i];
                 while(low<=high)
                 {
                     int m=(low+high)/2;
                     if(temp<A[m])
                           high=m-1;
                     else
                          low=m+1;
                   }
                 for(int j=i-1;j>=high+1;j--)
                        A[j+1]=A[j];
                 A[high+1]=temp;
                }
        } 

     

      (3)2路插入排序

         TInsertSort(int A[],int len)
         {
            int *D=new int[len];
            D[0]=A[0];
            int first=0,last=0;
            for(int i=1;i<len;i++)
            {
                 if(A[i]>D[0])
                 {
                     int j=1;
                     while(j<=last&&A[i]>=D[j])
                             j++;
                     last++;
                     for(int k=last-1;k>=j;k--)
                            D[k+1]=D[k];
                     D[j]=A[i];
                  }
                else
                {
                    int m=len-1;
                    if(first==0)
                    {
                       D[len-1]=A[i];
                       first=len-1;
                    }
                    else
                    {
                      while(m>=first&&D[m]<=A[i])
                                 m--;
                       first--;
                       for(int n=first+1;n<=m;n++)
                                D[n-1]=D[n];
                       D[m]=A[i];
                     }
                 }
            }
          for(i=0;i<len;i++)
                 A[i]=D[(first+i)%len];
          delete []D;
         }

      (4)希尔排序

2、交换排序

      (1)冒泡排序

       void BubbleSort(int A[],int len)
       {
          int temp;
          for(int i=1;i<len;i++)
             for(int j=0;j<len-i;j++)
                if(A[j]>A[j+1])
                {
                  temp=A[j];
                  A[j]=A[j+1];
                  A[j+1]=temp;
                 }
         }

      (2)快速排序

           (1)分解:把A[p..r]划分为两个(可能空)的子数组A[p ..q-1]和A[q+1 ..r],使得

                      A[p ..q-1] <= A[q] <= A[q+1 ..r]

           (2)解决:通过递归调用快速排序,对子数组A[p ..q-1]和A[q+1 ..r]快速排序。

           (3)合并:就地排序无需合并。

     int Partition(int A[],int p,int r)

         {

             int i=p-1;

             int temp;

             for(int j=p;j<r;j++)

                  {

                      if(A[j]<A[r])

                         {

                             i++;

                             temp=A[i];

                             A[i]=A[j];

                             A[j]=temp;

                         }

                  }

                temp=A[i+1];

                A[i+1]=A[r];

                A[r]=temp;

                return i+1;

          }

        void QuickSort(int A[],int p,int r)

            {

                if(p<r)

                    {

                         int q=Partition(A,p,r);

                          QuickSort(A,p,q-1);

                          QuickSort(A,q+1,r);

                    }

            }


原创粉丝点击