快速排序

 快速排序的主要思想就是:将待排序数组以某一个元素为阈值分为两个子列,一个子列包含所有比改阈值小的元素,另一个子列反之。这样只要将这两个子列排好序,整个数组也就排好序了。这里有一个关键的子过程就是划分的过程 Partition ,一般可以选择数组中任意的元素作为划分阈值,这里选择的是数组中最左端的元素。

       Partition使用了二分查找类似的思想:使用两个索引器从数组的两端进行遍历,左边的索引器遇到比阈值大的元素停止,右边的索引器遇到比自己小的元素停止,然后交换这两个元素,依次循环。这样数组就划分为了比该阈值大和小(含等于)两个子列了。 

 


#include  
< iostream >    
#include  
< vector >
#include  
< cassert >

using   namespace  std;   

template 
< class  T >
int  Partion(T  * input,  int  len)
{
    assert(input 
!= NULL);
    T temp 
= input[0];
    
int i = 0;
    
int j = len - 1;
    
/* 找到枢纽应在的位置*/
    
while (i < j)
    
{
        
/* 从后往前找到比枢纽小的元素 */
        
while (input[j] > temp && i < j)
        
{
            j
--;
        }

        
if (i >= j)
        
{
            
break;
        }

        
/* 从前往后找比枢纽大的元素 */
        
while (input[i] < temp && i < j)
        
{
            i
++;
        }

        
if (i >= j)
        
{
            
break;
        }

        swap(input[i], input[j]);
    }


    swap(input[i], temp);
    
/* 返回枢纽所在的位置 */
    
return i;
}


/* quick sort algorithm */
template 
< class  T >
void  QuickSort(T  * input,  int  len)
{
    assert(input 
!= NULL);
    
    
int pivot;
    
if (len <= 1)
    
{
        
return;
    }

    pivot 
= Partion(input, len);
    QuickSort(input, pivot);
    QuickSort(input 
+ pivot + 1, len - pivot - 1);
}


int  main( void )   
{   
    
int a[] = {89-32135453443};
    QuickSort(a, 
sizeof(a)/sizeof(int));
    
for (int i =0; i < sizeof(a)/sizeof(int); i++)
    
{
        cout 
<< a[i] << endl;
    }


    
return 0;   
}
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值