每日编程2之快速排序
2013-02-23 10:49
113 查看
6 4 3 7 5
用变量i记录,(i+1)代表着下一个比pivot大的元素,j对元素序列进行遍历(p<=j<=q-1),当其遍历的元素比pivot小,则交换A[i+1]与A[j]
始终保持i,i+1为序列中小元素,大元素的分界线...
遍历完成后交换A[q]与A[i+1],此时i+1即为A[q]元素的最终位置,
以此为界,形成的二个子序列进行递归,递归结束的条件是p<=q,即只有一个/零个元素的情况
核心代码:
int quickSort(float A[],int p,int q)
{
if(p<q)
{
float pivot = A[q];
int i = p-1;
int j;
for(j=p;j<q;j++)
{
if(A[j]<pivot) {SWAP(A[i+1],A[j]); i++;}
}
SWAP(A[i+1],A[q]);
quickSort(A,p,i);
quickSort(A,i+2,q);
}
}
编码过程中出现的二个问题:
(1)之前用int pivot而不是float pivot,结果在赋值int pivot=A[q]的时候,浮点数自动取整
(2)在quickSort的排序过程中,交换的发生双方可能是同一个元素(比如A[0]),这就导致程序中的SWAP交换宏不能正常使用,产生很多0元素
用变量i记录,(i+1)代表着下一个比pivot大的元素,j对元素序列进行遍历(p<=j<=q-1),当其遍历的元素比pivot小,则交换A[i+1]与A[j]
始终保持i,i+1为序列中小元素,大元素的分界线...
遍历完成后交换A[q]与A[i+1],此时i+1即为A[q]元素的最终位置,
以此为界,形成的二个子序列进行递归,递归结束的条件是p<=q,即只有一个/零个元素的情况
核心代码:
int quickSort(float A[],int p,int q)
{
if(p<q)
{
float pivot = A[q];
int i = p-1;
int j;
for(j=p;j<q;j++)
{
if(A[j]<pivot) {SWAP(A[i+1],A[j]); i++;}
}
SWAP(A[i+1],A[q]);
quickSort(A,p,i);
quickSort(A,i+2,q);
}
}
编码过程中出现的二个问题:
(1)之前用int pivot而不是float pivot,结果在赋值int pivot=A[q]的时候,浮点数自动取整
(2)在quickSort的排序过程中,交换的发生双方可能是同一个元素(比如A[0]),这就导致程序中的SWAP交换宏不能正常使用,产生很多0元素
相关文章推荐
- 每日编程3之快速排序随机化版本
- 每日编程7之快速排序非递归版本
- 每日一题(92) - 快速排序
- 每日一题4:快速排序
- 编程珠玑----快速排序的变形
- 编程之美-电梯调度-快速排序-查找第K大数
- 编程练习:快速排序
- 编程菜鸟的日记-初学尝试编程-链表元素快速排序
- MoreWindows 专注于Windows编程 白话经典算法系列之六 快速排序 快速搞定
- Ruby学习之路——编程实践【3】 排序——快速排序
- 【编程素质】算法-快速排序
- 编程珠玑之快速排序
- 编程实现直接插入排序、希尔排序、冒泡排序、快速排序、选择排序
- 【每日算法】快速排序
- 消除原理____假设数组中有一个数字出现的次数超过了数组长度的一半,试编程找出这个数字(qosrt 快速排序 哈希)
- 假设数组中有一个数字出现的次数超过了数组长度的一半,试编程找出这个数字(消除 qosrt 快速排序 哈希)
- 每日算法1:快速排序
- 我的编程学习日志(8)--排序(冒泡,选择,快速以及sort函数)
- 爱创课堂每日一题第二十七天-2017/9/29 快速 排序的思想并实现一个快排?
- 我的编程学习日志(8)--排序(冒泡,选择,快速以及sort函数)