您的位置:首页 > 移动开发 > 微信开发

每天一个小程序(15)——交换排序之快速排序

2014-03-31 16:22 239 查看
快速排序法原理也是用了分治法,主要原理是将数组分为A[p..q-1] 和A[q+1..r],然后调整元素使得A[p..q-1]小于等于q,也小于等于A[q+1..r]。然后不断的递归,到最后就排序完成。

通俗的话语讲就是,排序之前选择一个标志数据(一般选择最后一个),然后第一次排序中,以此标记数据为基准,小于它的放在“小数据区”,比如左半边区,大于它的放在“大数据区”,比如右半边区,然后得到中间的位置,以此位置将程序分为宏观有序(左半边区之和小于右半边区)的两部分,再通过第一步的方法,将这两部分再分成宏观有序的四部分,最后直到不能再继续分位置,则该序列有序。

#include<stdio.h>

void QuickSort(int *A, int p, int r);
int Partition(int *A, int p, int r);
void Display(int *A)
{
for(int i = 0; i < 20; i++)
{
printf("%d ",A[i]);
}
}

void main()
{
int A[] = {5,4,7,1,13,0,322,92,35,19,3,78,-32,45,77,43,933,8,49,11};
QuickSort(A,0,19);
Display(A);
}

void QuickSort(int *A, int p, int r)
{
int q;
if(p < r)
{
q = Partition(A,p,r);
QuickSort(A,p,q - 1);
QuickSort(A,q + 1,r);
}
}

int Partition(int *A, int p, int r)//分治法,作用就是将数组分为A[p..q-1] 和A[q+1..r]
{
int x,i,j,temp;

x = A[r];
i = p - 1;
for(j = p; j <= r - 1; j++)//以A[r]为判断标准,然后调整元素使得A[p..q-1]小于等于A[r],也小于等于A[q+1..r]
{
if(A[j] <= x)//交换
{
i += 1;
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
temp = A[i + 1];//交换
A[i + 1] = A[r];
A[r] = temp;

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