快速算法演示

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

时间复杂度:
最坏情况的时间是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();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值