快速排序一轮的代码实现
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)。
相关文章推荐
- 简单的C语言快速排序实现代码
- 快速排序-常见中轴(主元pivot)选择方法及实现代码(末位/随机/三数中值/..)
- 快速排序实现代码
- 算法代码实现之三向切分快速排序,Java实现
- 算法代码实现之快速排序,Java实现
- 交换排序——冒泡排序和快速排序,C++代码实现
- 【数据结构与算法】【排序】快速排序的代码实现
- 快速排序的原理及java代码实现
- 快速排序代码实现
- 算法代码实现之三向切分快速排序,Golang(Go语言)实现
- 快速排序的非递归实现代码
- 快速排序--Java实现代码
- Ruby一行代码实现快速排序
- Python实现冒泡排序、选择排序、插入排序、快速排序、归并排序、二分法查找算法(基于《算法导论》伪代码)
- JAVA排序算法实现代码-快速(Quick Sort)排序
- JS实现随机化快速排序的实例代码
- 快速排序的C语言代码实现
- 用JAVA代码实现快速排序
- 算法代码实现之快速排序,C/C++实现
- 算法代码实现之快速排序,Golang(Go语言)实现