关于C语言快速排序的问题

步丶丶 2016-07-23 03:12:39
在做PAT的是时候,用普通的快速排序,在评分后会出现运行超时。

而在网上找到的这种代码不会出现,但是看不懂代码是什么意思,还求前辈解释。

#include <stdio.h>

#define MAXN 10
typedef float ElementType;

ElementType Median(ElementType A[], int N);

int main()
{
ElementType A[MAXN];
int N, i;

scanf("%d", &N);
for (i = 0; i<N; i++)
scanf("%f", &A[i]);
printf("%.2f\n", Median(A, N));
return 0;
}

/*您的代码将被嵌在这里*/

void Swap(ElementType *a, ElementType *b)
{
ElementType temp = *a;
*a = *b;
*b = temp;
}

ElementType Median3(ElementType A[], int left, int 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 QSort(ElementType A[], int left, int right)
{
if (left >= right) return;
ElementType Pivot = Median3(A, left, right);
int 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]);
QSort(A, left, i - 1);
QSort(A, i + 1, right);
}

ElementType Median(ElementType A[], int N)
{
QSort(A, 0, N - 1);
return A[N / 2];
}
...全文
298 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
步丶丶 2017-02-17
  • 打赏
  • 举报
回复
引用 2 楼 qq423399099 的回复:
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
会用设断点调试之后才发现其原来是如此好用,一定以后靠自己了解代码!
小灸舞 2016-07-23
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
lm_whales 2016-07-23
  • 打赏
  • 举报
回复
这典型的三数中值分割算法的快速排序 这样做的好处,是最大限度的使 划分算法的哨兵随机化 当然,随机化最好的,就是用随机数来做,不过随机数生成的代价很高,不划算 另外,在数据少于10~20 个时,改用插入排序 能更好的改进,快速排序的速度 快速排序的思想就是,对数据进行划分 方法是,找到一个数据,以它的值为中心,所有数据,划分到两边,例如小的在左,大的在右边 经过若干轮划分以后 所有的数据都是有序的 while (1) { while (A[++i] < Pivot) {} while (A[--j] > Pivot) {} if (i < j){ Swap(&A[i], &A[j]); } else break; } 这部分就是划分算法,不用三数中值分割,也几乎是这样做的

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧