您的位置:首页 > 编程语言

快速排序一轮的代码实现

2015-04-08 23:22 295 查看
#include <stdio.h>
void PrintArray(int a[], int arr_len)
{
  int i;
 for(i=1;i<arr_len;i++)
 {
 printf("%d ",a[i]);
 }
 printf("\n");
}
void swap(int a[], int low, int high)
{
int temp = a[low];
a[low] = a[high];
a[high] = temp;
}
int Partition(int a[], int low, int high)
{
 int pivotkey;
/*low的下标从1开始,数组第一个元素用0占位,其实排序的是从a[1]开始的元素*/
 /*pivotkey作为标记,一次调整后他的左端元素将比它小,它的有段元素将比它大*/
pivotkey = a[low];
while(low<high)
{
 /*分界元素的右侧序列最后一个元素比标记分界元素大,
右端最后一个元素下标左移,缩小标记分界元素右端序列*/
while(low<high&&a[high]>=pivotkey)
{
 high--;
}
 /*将标记元素右侧开始标记为较大元素(a[high])移动至标记元素(a[low])左侧,
标记元素移动到开始标记的较大元素位置处*/
swap(a,low,high);
/*分界元素的左侧序列第一个元素比标记分界元素小,
左端最第一个元素下标右移,缩小标记分界元素左端序列*/
while(low<high&&a[low]<=pivotkey)
{
 low++;
}
 /*将标记元素左侧开始标记为较小元素移动至标记为较大元素a[high]右侧,
开始标记为较小(a[low])的元素移动到开始标记为的较小元素位置处*/
swap(a,low,high);
}
return low;
}
int main()
{
 int a[] = {0,50,10,90,30,70,40,80,60,20};
printf("一轮快速排序前:");
int arr_len = sizeof(a)/sizeof(int);
  PrintArray(a,arr_len);
Partition(a,1,arr_len);
printf("一轮快速排序后:");
PrintArray(a,arr_len);
return 0;
}

整个代码运行如下图:(图中真正参与排序的元素是50~90(即a[1]~a[9]),红色元素0是占位元素,开始low=1,high =9

pivotkey = a[low] =a[0] = 50并且满足while循环1=low<high=9,先是循环内的第一个循环满足low<high(1<9)但不满足a[high]>pivotkey(不满足20>50),

所以循环结束,交换a[low]和a[high]变成了第二行的结果。

紧接着low<high(1<9)而且a[low](a[1]这个时候值为20)小于50,所以low下标加1,low值变成2,这个时候a[low](a[2])值变成10,还是满足循环,所以继续low++

这个时候a[low](a[3])值变成90(不满足a[low]<=pivotkey即不满足90<=50),所以第二个循环结束,交换a[low]和a[high](a[3]和a[9],即90和50)这样就得到了第5行的结果

(20, 10, 50,30, 70, 40,80, 60,90)。





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