快速算法演示

    技术2022-05-11  51

     快速算法是通过反复对产生的文件进行划分来实现的

    时间复杂度:最坏情况的时间是O(n2)平均情况的时间是O(nlogn)

    空间复杂度:当n>1  S(n)=2+S(|_(n-1)/2_|)当n<=1 S(n)=0

    (C#)源代码 quicksort.cs

    using  System; using  System.Text; namespace  cn.blog8s{     ///   <summary>      ///  快速分类算法演示     ///   </summary>      public   class  BINSRCH    {         static   void  Main()        {             int [] A  =   new   int [] {  65 70 75 80 85 60 55 50 45 32767  };            print(A,  9 );            quickSort(A,  0 9 );            Console.Write( " 请输入一个大于1且小于9的数:  " );             int  k  =  Convert.ToInt32(Console.ReadLine());            Console.WriteLine( " "   +  k  +   " 小元素是: "   +  A[select(A,  9 , k  -   1 )]);            Console.Read();        }         private   static   int  partition( int [] a, int  m, int  p)        { // 划分集合算法               int  v  =  a[m]; // 划分元素              int  i  =  m;             int  sum  =  p;             int  temp;             while  ( true )            {                 do                 {                    i ++ ;                }                 while  (a[i] < v); // 找一个比划分元素大的元素                  do                 {                    p -- ;                }                 while  (a[p] > v); // 找一个比划分元素小的元素                  if  (i  <  p)                {                    temp  =  a[i]; a[i]  =  a[p]; a[p]  =  temp; // 用上面找出来的值来交换                 }                 else                 {                     break ;                }            }            a[m]  =  a[p]; a[p]  =  v; // 把划分元素和右半部分最小的值交换             Console.Write( " 本次划分元素: " + a[p] + "     " );            print(a,  9 );             return  p; // p是快速分类划分元素的下标a[p]是第p小的值,划分元素是位置不用变了         }         private   static   void  quickSort( int [] a, int  p, int  q)        { // 快速分类算法              int  j;             if  (p  <  q)            {                j  =  partition(a, p, q + 1 ); // j是返回的划分元素的位置 参数q+1很关键记得要加1哦                 quickSort(a, p, j  -   1 );                quickSort(a, j  +   1 , q);             }         }         private   static   int  select( int [] a, int  n, int  k)        { // 选择算法              int  N  =  n;             int  m  =   0 ;             int  j;            Console.WriteLine( " 选择问题算法开始执行 " );             do             {                                j = partition(a,m,N);                 if  (j  ==  k)                {                     break ;                }                 else   if  (k  <  j)                {                    N  =  j;                }                 else                 {                    m  =  j  +   1 ;                }            }             while  ( true );             return  j;        }         private   static   void  print( int [] a, int  sum)        { // 打印用              for  ( int  i  =   0 ; i  <  sum; i ++ )            {                Console.Write(a[i] + "   " );            }            Console.WriteLine( "" );        }    }}

     

    (c++)源代码 quicksort.cpp (这个代码没有包含选择算法)

    #include  < stdlib.h > #include  < iostream.h > int  a[] = { 65 , 70 , 75 , 80 , 85 , 60 , 55 , 50 , 45 , 32767 }; void  print(){     for  ( int  i = 0 ;i < 9 ;i ++ )    {        cout << a[i] << "   " ;    }    cout << endl;} int  partition( int  m, int  p){     int  i,j,k;     int  v;     int  temp;    v = a[m];    i = m;    j = p;     while  (i < j)    {         do          {            i ++ ;        }         while  (a[i] < v);                 do         {            j -- ;        }         while  (a[j] > v);         if  (i < j)        {          temp = a[i];          a[i] = a[j];          a[j] = temp;        }    }    a[m] = a[j];    a[j] = v;    print();     return  j;} void  quicksort( int  p, int  q){     int  i;     int  j;    i = p;    j = q;     if  (i < j)    {        j = q + 1 ;    j = partition(i,j);    quicksort(i,j - 1 );    quicksort(j + 1 ,q);    }    } void  main(){  quicksort( 0 , 9 );  print();}

    最新回复(0)