您的位置:首页 > 其它

快速排序

2015-05-31 23:01 363 查看
快速排序采用的是分治递归的策略

(1)选取枢纽元:采用三数中值分割法来选取枢纽元,一般的做法是使用左端、右端和中心位置上的三个元素的中值作为枢纽元

(2)分割策略

首先,通过枢纽元与最后的元素交换,使得枢纽元离开要被分割的数据段(即i从第一个元素开始,而j从倒数第二个元素开始)

接着,在分割段要做的是把所有比枢纽元小的元素移到数组左边,而把所有比枢纽元大的元素移到数组的右边。当i和j停止时,i指向一个大于枢纽元的元素,而j指向一个小于枢纽元的元素。此时,若i小于j,则将i,j处的元素交换,否则退出循环

最后,将枢纽元与i所指向的元素交换

快速排序为不稳定的排序,其时间复杂度最差为O(n2),平均为O(nlogn),空间复杂度为O(logn)

void Swap(int *a, int *b);//交换两元素的值

int Median3(int A[], int Left, int Right);//三数中值分割法

void InsertSort(int A[], int size);//插入排序

void Qsort(int A[], int Left, int Right);//快速排序子函数

void QuickSort(int A[], int size);//快速排序函数

int main(void)

{

int A[] = {8,1,4,9,0,4,3,5,4,2,7,7,6,8};

int i, size = sizeof(A)/sizeof(int);

QuickSort(A, size);//快速排序
for(i = 0; i < size; i++)
{
printf("%d ", A[i]);
}
printf("\n");

return 0;


}

void Swap(int *a, int *b)//交换两元素的值

{

int temp;

temp = *a;
*a = *b;
*b = temp;


}

int Median3(int A[], int Left, int Right)//Left为第一个元素的位置,Right为最后一个元素的位置

{

int Center = (Left + Right)/2;

if(A[Left] > A[Center])
Swap(&A[Left], &A[Center]);
if(A[Left] > A[Right])
Swap(&A[Left], &A[Right]);
if(A[Center] > A[Right])
Swap(&A[Center], &A[Right]);

Swap(&A[Center], &A[Right-1]);//将枢纽元放在数组的倒数第二个位置上,最后一个元素肯定大于枢纽元

return A[Right-1];


}

void InsertSort(int A[], int size)

{

int i, j;

int temp;

for(i = 1; i < size; i++)
{
temp = A[i];
for(j = i; (j >0) && (A[j-1]) > temp; j--)
{
A[j] = A[j-1];
}
A[j] = temp;
}


}

void Qsort(int A[], int Left, int Right)//Left为第一个元素的位置,Right为最后一个元素的位置

{

int i, j;

int Pivot;//枢纽元

int Cutoff = 3;

if(Left + Cutoff <= Right)//当参与排序的元素个数大于3时
{
Pivot = Median3(A, Left, Right);
i = Left;   j = Right-1;
while(1)
{
while(A[++i] < Pivot){}
while(A[--j] > Pivot){}
if(i < j)
Swap(&A[i], &A[j]);
else
break;
}
Swap(&A[i], &A[Right-1]);//将枢纽元与i所指的元素交换

Qsort(A, Left, i-1);//对枢纽元左边的元素进行快速排序
Qsort(A, i+1, Right);//对枢纽元右边的元素进行快速排序
}
else//当参与排序的元素个数不大于3时
{
InsertSort(A+Left, Right-Left+1);//采用插入排序
}


}

void QuickSort(int A[], int size)

{

Qsort(A, 0, size-1);

}

另一种实现方法:

void myqort(int *a, int len)

{

if (a == NULL || len <= 1)
return;

int val = a[0];
int start = 0;
int end = len-1;

while (start < end)
{
while (start < end)
{
if (a[end] < val)
{
a[start++] = a[end];
break;
}
end--;
}
while (start < end)
{
if (a[start] > val)
{
a[end--] = a[start];
break;
}
start++;
}
}

a[start] = val;

myqort(a, start);
myqort(a+start+1, len-start-1);


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: