C语言的快速排序法的算法 顺便把变化过程用文字描述一下,简单的数组排序

越看越搞不清楚~~~怎么有的变化过程中是先弄出1组数中的中间大小的数,而有的则是头尾什么交换... 越看越搞不清楚~~~怎么有的变化过程中是先弄出1组数中的 中间大小的数,而有的则是头尾什么交换 展开
 我来答
r1renhw
2012-11-08 · TA获得超过1577个赞
知道小有建树答主
回答量:810
采纳率:100%
帮助的人:421万
展开全部
# include "stdio.h"
typedef int InfoType;//定义数据项类型
# define MAX_SIZE 20//小顺序表的最大长度
typedef int KeyType;//关键字类型为整型
struct RedType //记录类型
{
KeyType key;//关键字项
InfoType otherinfo;//其他数据项
};
struct SqList//顺序表类型
{
RedType r[MAX_SIZE+1];//r[0]闲置或用作哨兵单元
int length;//顺序表长度
};
//交换顺序表L中子表L.r[low...high]的记录,使枢轴记录到位
//并返回其所在位置,此时在它之前(后)的记录均不大(小)于它
int Partition(SqList * L,int low,int high)
{
RedType t;
KeyType pivotkey;
pivotkey = (* L).r[low].key;//用子表的第一个记录作枢轴记录
while (low < high)//从表的两端交替地向中间扫描
{
while (low<high && (* L).r[high].key>=pivotkey)
{
--high;
}
t = (* L).r[low];//将比枢轴记录小的记录交换到低端
(* L).r[low] = (* L).r[high];
(* L).r[high] = t;
while (low<high && (* L).r[low].key<=pivotkey)
{
++low;
}
t = (* L).r[low];//将比枢轴记录大的记录交换到高端
(* L).r[low] = (* L).r[high];
(* L).r[high] = t;
}
return low;//返回枢轴所指位置
}
//对顺序表L中的子序列L.r[low...high]作快速排序
void QSort(SqList * L,int low,int high)
{
int pivotloc;
//长度大于1
if (low < high)
{
pivotloc = Partition(L,low,high);//将L.r[low...high]一分为二
QSort(L,low,pivotloc-1);//对低子表递归排序,pivotloc是枢轴位置
QSort(L,pivotloc+1,high);//对高子表递归排序
}
}
//对顺序表L作快速排序
void QuickSort(SqList * L)
{
QSort(L,1,(* L).length);
}
void print(SqList L)
{
int i;
for (i=1; i<=L.length; ++i)
{
printf("(%d,%d)",L.r[i].key,L.r[i].otherinfo);
}
printf("\n");
}
int main(void)
{
RedType d[8] =
{
{50,1},{40,2},{30,3},{20,4},{60,5},
{10,6},{70,7},{80,8}
};
SqList l;
int i;
for (i=0; i<8; ++i)
{
l.r[i+1] = d[i];
}
l.length = 8;
printf("排序前输出:\n");
print(l);
QuickSort(&l);
printf("排序后输出:\n");
print(l);
return 0;
}
/*
结果:
------------------------
排序前输出:
(50,1)(40,2)(30,3)(20,4)(60,5)(10,6)(70,7)(80,8)
排序后输出:
(10,6)(20,4)(30,3)(40,2)(50,1)(60,5)(70,7)(80,8)
Press any key to continue
------------------------------
*/
追问
亲,我只要最简单的那种就好。。a[10]={6,5,2,8,9,1,4,3,7,0}这样能输出小到大就好。。
追答
# include 
void QuickSort(int * a, int low, int high);//快速排序
int FindPos(int * a, int low, int high);//找位置
int main(void)
{
int a[10]={6,5,2,8,9,1,4,3,7,0};
QuickSort(a, 0, 9);//第二个参数表示第一个元素的下标,
//第三个参数表示最后一个元素的下标
int i;
for (i=0;i=val)
--high;
a[low] = a[high];
while (low<high && a[low]<=val)
++low;
a[high] = a[low];
}//终止while循环之后,low和high一定是相等的
a[low] = val;
return low;//low可以改为high,但不能改为val
//a[low] a[high]
}
/*
-----------------
0 1 2 3 4 5 6 7 8 9
Press any key to continue
------------------
*/
孙永超fight
2012-11-08 · TA获得超过732个赞
知道小有建树答主
回答量:603
采纳率:0%
帮助的人:674万
展开全部
快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
一趟快速排序的算法是:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即 key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j=j-1即j--),找到第一个小于key的值A[j]
4)从i开始向后搜索,即由前开始向后搜索(i=i+1即i++),找到第一个大于key的A[i],A[i]与A[j]交换;
5)重复第3、4、5步,直到 I=J; (3,4步是在程序中没找到时候j=j-1,i=i+1,直至找到为止。找到并交换的时候i, j指针位置不变。另外当i=j这过程一定正好是i+或j-完成的最后令循环结束。)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式