快速算法原理:
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); // 对右段排序 }