快速算法

快速算法原理:

    1、 判断输入参数的合法性

    2、把数组的第一个数据作为比较的原点,比该数据小的数据排列在左边,比该数据大的数据排列在右边

    3、按照(2)的方法分别对左边的数组和右边的数据进行和(2)一样的数据排列


编程过程:

      a)首先,判断数据的合法性?    

void isLegal(int array[],int length)
{ 
       if(NULL==array || 0==length)
       {
              return;
        }
       Quick_Sort(array,0,length-1);
}

     b)寻找中间数,分别对左边和右边的数据进行排序

Quick_sort(int array[],int start,int end)
{
       int middle;
       if(start>=end)
       {
             return;
       }
       middle=getMiddle(array,start,end);
       Quick_Sort(array,start,middle-1);
       Quick_Sort(array,middle+1,end);
}

       c)那么这里的中间数应该怎么安排呢?

int getMiddle(int array[], int start, int end)  
{  
    int front = 0;  
    int tail = end - start;  
    int value = array[start];  
    int length = end - start + 1;  
    int loop = start + 1;  
      
    while(loop <= end){  
        if(array[loop] < value)
        {  
            gQuickSort[front] = array[loop];  
            front ++;  
        }
        else {  
        gQuickSort[tail] = array[loop];  
            tail --;  
        }  
       loop ++;  
    }  
    gQuickSort[front] = value;  
    memmove(&array[start], gQuickSort, sizeof(int) * (length));  
    return start + front ;  
}  

泛型编程

template<class T>  
void QuickSort(T *a, int n){  
    _quickSort(a, 0, n-1);  
}  
  
  
template<class T>  
void Swap(T *a, T *b){  
    T *tmp=(T *)malloc(sizeof(T)); //要记得释放  
    *tmp=*a;  
    *a=*b;  
    *b=*tmp;  
}  
  
template<class T>  
void _quickSort(T a[], int s, int r){  // s-开始排序的下标   r-结束排序的下标     
    if(s>=r) return;  
  
    int i=s, j=r+1;  
    T pivot=a[s];  // 以第一个元素为轴  
  
    // 把左侧>=pivot与右侧<=pivot的元素进行交换  
    while(true){  
        do{ // 在左侧寻找>=pivot的元素  
            ++i;  
        }while(a[i]<pivot);  
          
        do{  
            --j;  
        }while(a[j]>pivot);  
  
        if(i>=j) break;  
  
        Swap(&a[i],&a[j]);  
    }  
  
    // 把轴移到i,j的交汇处  
    Swap(&a[s], &a[j]);  // a[I]为轴  
  
    quickSort(a,s,j-1);  // 对左段排序  
    quickSort(a, j+1, r);  // 对右段排序  
}  












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值