快速排序的两种实现

 李师兄给大家安排了新的内容,我这周的工作是看算法与数据结构。
今天看了第二节了,是快速排序的东西,在C下实现了两个小算法。记录下来以备后用。


#include  " stdafx.h "
using   namespace  std;

void  run( int *  pData, int  left, int  right)
{

    
int i,j;

    
int middle,iTemp;

    i 
= left;

    j 
= right;

    middle 
= pData[(left+right)/2];          //求中间值



    
while(i<=j)                    //如果两边扫描的下标交错,就停止(完成一次) 

    
{

        
while((pData[i]<middle) && (i<right)) //从左扫描小于中值的数                 ?????????????

            i
++

        
while((pData[j]>middle) && (j>left))  //从右扫描大于中值的数

            j
--;

        
if(i<=j)//找到了一对值

        
{

            
//交换

            iTemp 
= pData[i];

            pData[i] 
= pData[j];

            pData[j] 
= iTemp;

            i
++;

            j
--;

        }


    }




    
//当左边部分有值(left<j),递归左半边

    
if(left<j)

        run(pData,left,j);

    
//当右边部分有值(right>i),递归右半边

    
if(right>i)

        run(pData,i,right);

}
 



void  QuickSort( int *  pData, int  Count)

{

    run(pData,
0,Count-1);

}
 



void  main()

{

    
int data[] = {4,6,9,5,7,8,10};

    QuickSort(data,
7);

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

        cout
<<data[i]<<" ";

    cout
<<" ";

}
 




下面的代码理解起来稍简单一点,但很明显速度不是最快的。






// 另一种实验方法:::::::::::::::::::::::::::::::::::::::::

// #include "stdafx.h"
// using namespace std;
///*swap: 交换v[i],v[j]*/
// void swap(int v[], int i, int j)
// {
//     int temp;
//     temp=v[i];
//     v[i]=v[j];
//     v[j]=temp;
// }
//
//
///*快速排序:将数组V[]进行升序排序*/
// void quicksort(int v[], int n)
// {
//     int i,last;
//     if(n <= 1) /*如果数组中元素个数小于1则什么也不作*/
//         return;
//     swap(v, 0, rand() % n); /*选数组中最后一个元素作基准,并将基准元素移到V[0]处*/
//     last = 0;
//     for(i = 1; i <n ; i++)
//     {
//         if(v[i] < v[0])
//             swap(v, ++last, i);    
//     }
//     swap(v, 0, last);
//     quicksort(v, last);
//     quicksort(v+last+1, n-last-1);
// }                            
//
// void main()
// {

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

//     quicksort(a,7);

//     for (int i=0;i<7;i++)

//     {

//         cout<<a[i]<<endl;

//     }

// }
//

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值