快速排序是对冒泡排序的一种改进。它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

假设要排序的数组是A[1]……A[N],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一躺快速排序。一躺快速排序的算法是:

1)、设置两个变量I、J,排序开始的时候I:=1,J:=N;

2)以第一个数组元素作为关键数据,赋值给X,即X:=A[1];

3)、从J开始向前搜索,即由后开始向前搜索(J:=J-1),找到第一个小于X的值,两者交换;

4)、从I开始向后搜索,即由前开始向后搜索(I:=I+1),找到第一个大于X的值,两者交换;

5)、重复第3、4步,直到I=J;

例如:待排序的数组A的值分别是:(初始关键数据X:=49)

A[1]      A[2]      A[3]      A[4]      A[5]       A[6]      A[7]:

49         38        65        97        76        13         27

进行第一次交换后:    27         38        65        97        76        13         49

( 按照算法的第三步从后面开始找

进行第二次交换后:    27         38        49        97        76        13         65

( 按照算法的第四步从前面开始找>X的值,65>49,两者交换,此时I:=3 )

进行第三次交换后:    27         38        13        97        76        49         65

( 按照算法的第五步将又一次执行算法的第三步从后开始找

进行第四次交换后:    27         38        13        49        76        97         65

( 按照算法的第四步从前面开始找大于X的值,97>49,两者交换,此时J:=4 )

此时再执行第三不的时候就发现I=J,从而结束一躺快速排序,那么经过一躺快速排序之后的结果是:27         38        13        49        76        97         65,即所以大于49的数全部在49的后面,所以小于49的数全部在49的前面。

快速排序就是递归调用此过程——在以49为中点分割这个数据序列,分别对前面一部分和后面一部分进行类似的快速排序,从而完成全部数据序列的快速排序,最后把此数据序列变成一个有序的序列,根据这种思想对于上述数组A的快速排序的全过程如图6所示:

初始状态                         {49      38      65      97      76      13      27}

进行一次快速排序之后划分为       {27      38      13}      49    {76      97      65}

分别对前后两部分进行快速排序        27

结束          结束     {49     65}     76

49            结束

结束

图6     快速排序全过程

1)、设有N(假设N=10)个数,存放在S数组中;

2)、在S[1。。N]中任取一个元素作为比较基准,例如取T=S[1],起目的就是在定出T应在排序结果中的位置K,这个K的位置在:S[1。。K-1]<=S[K]<=S[K+1..N],即在S[K]以前的数都小于S[K],在S[K]以后的数都大于S[K];

3)、利用分治思想(即大化小的策略)可进一步对S[1。。K-1]和S[K+1。。N]两组数据再进行快速排序直到分组对象只有一个数据为止。

如具体数据如下,那么第一躺快速排序的过程是:

数组下标: 1       2       3       4       5       6       7       8       9       10

45      36      18      53      72      30      48      93      15       36

I                                                                    J

(1)       36      36      18      53      72      30      48      93      15       45

(2)       36      36      18      45      72      30      48      93      15       53

(3)       36      36      18      15      72      30      48      93      45       53

(4)       36      36      18      15      45      30      48      93      72       53

(5)       36      36      18      15      30      45      48      93      72       53

通过一躺排序将45放到应该放的位置K,这里K=6,那么再对S[1。。5]和S[6。。10]分别进行快速排序。

以下是我改写的代码,通过测试:

BOOL QuickSort(U16*p,int num)

{

int i;

int n_small=1,n_big=num-1;//升序

U16 m_key=p[0];

BOOL xiaokong=true;//小头有空

int m_free = 0;

if(num<=1)return true;///递归终止条件

for(i=0;i

{

if(xiaokong)//小头有空

{

if(p[n_big]

{

p[m_free]=p[n_big];

m_free=n_big;

xiaokong=false;

}

n_big--;

}

else//大头有空

{

if(p[n_small]>m_key)

{

p[m_free]=p[n_small];

m_free=n_small;

xiaokong=true;

}

n_small++;

}

}

if(m_free != 0)

{

p[m_free]=m_key;

}

//printf("num=%d[", num);

//for( i = 0; i< num; i++) printf("%d,", p[i]);

//printf("]key=%d, mid = %d, small=%d, big=%d, from %d num %d && from %d num %d\n",

// m_key, m_free, n_small, n_big, 0,m_free, m_free+1, num-(m_free+1) );

if(QuickSort(&p[0],m_free) && QuickSort(&p[m_free+1],num-(m_free+1) ) )

{

return true;

}

return false;

}

void QuickSortTest(void)

{

int i;

U16 sortTest[20] = {23,4,6,9,5,7,4,12,12,23,4,9999,89,1000,1000,4,2334,989,12,20};

U16 sortTest2[10] = {10,9,8,7,6,5,4,3,2,1};

U16 sortTest3[10] = {0,1,2,3,4,5,6,7,8,9};

for( i = 0; i<20; i++) printf("%d,",sortTest[i]);  printf("\n");

QuickSort( sortTest, 20);

for( i = 0; i<20; i++) printf("%d,",sortTest[i]); printf("\n");

for( i = 0; i<10; i++) printf("%d,",sortTest2[i]);  printf("\n");

QuickSort( sortTest2, 10);

for( i = 0; i<10; i++) printf("%d,",sortTest2[i]); printf("\n");

for( i = 0; i<10; i++) printf("%d,",sortTest3[i]);  printf("\n");

QuickSort( sortTest3, 10);

for( i = 0; i<10; i++) printf("%d,",sortTest3[i]); printf("\n");

}

posted on 2008-03-19 15:21 游子 阅读(24309) 评论(7)  编辑 收藏 引用 所属分类: 硬件 、原创技术

快速排序c语言单链表代码,快速排序算法及源代码(C语言)相关推荐

  1. C语言单链表代码实现

    C语言单链表代码实现 一.头文件.常量以及自定义数据结构 #include<stdio.h> #include<malloc.h> #include<stdlib.h&g ...

  2. C语言单链表实现FCFS算法,2014腾讯实习笔试题

    2014腾讯实习笔试题 1. 关于二叉树,下面说法正确的是() A. 对于N个节点的二叉树,其高度为nlog2n; B. 一个具有1025个节点的二叉树,其高度范围在11~1025之间 C. 二叉树的 ...

  3. C语言单链表实现FCFS算法,数据结构与算法复习题(含答案).doc

    <数据结构与算法>2015-2016学年第1学期考试复习题 选择题(下面各小题有一个正确答案,请将正确答案的编号填写在各小题的括号内). 1.在一棵具有5层的满二叉树中结点总数为( A ) ...

  4. 用c语言单链表编写贪吃蛇程序6,C语言链表实现贪吃蛇游戏

    阅读学习了源代码,并做了简单的注释和修改,里面只用了链表数据结构,非常适合C语言入门者学习阅读. 程序可在VS2013下编译运行. #include #include #include #includ ...

  5. c语言单链表需要头结点,一个关于C语言链表头结点的问题

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include typedef struct STU{ int sno; char sname[10]; float ...

  6. 单链表的快速排序(转)

    2010年11月30日 星期二 15:13 单链表的快速排序和数组的快速排序在基本细想上是一致的,以从小到大来排序单链表为例, 都是选择一个支点,然后把小于支点的元素放到左边,把大于支点的元素放到右边 ...

  7. C语言一趟冒泡交换最小值,C语言单链表冒泡排序为啥以下代码实现不了?

    struct node *sort(struct node *head)/*排序*/ { struct node *p,*q; struct node *temp; for(p=head;p!=NUL ...

  8. C语言单链表,能直接运行的代码!

    C语言单链表,实现增删改查 不废话 直接上代码,COPY就能运行 #include <stdio.h> #include <stdlib.h> /** *定义数据元素 */ t ...

  9. c语言递增20,2020-07-20(C语言)数据结构-在一个递增有序的线性表中,有数值相同的元素存在。若存储方式为单链表,设计算法去掉数值相同的元素,使表中不再有重复的元素...

    //在一个递增有序的线性表中,有数值相同的元素存在.若存储方式为单链表,设计算法去掉数值相同的元素,使表中不再有重复的元素,例如:(7,10,10,21,30,42,42,51,70)将变为(7,10 ...

最新文章

  1. mysql存储过程语法及实例
  2. 【深度学习】超强优化器如何与网络有机结合
  3. 四 配置sshd与samba服务
  4. 2016 大数据版图
  5. 在Qt工程文件中根据不同版本号使用不同源码
  6. ADO.NET知识汇总
  7. 【转】基于jquery,bootstrap数据验证插件bootstrapValidator 教程
  8. Python第一天学习---基础语法
  9. ffmpeg库编译加文字_1.编译ffmpeg库
  10. java多线程编程_Java多线程编程
  11. Sparklyr与Docker的推荐系统实战
  12. Linux之常用Shell脚本总结
  13. Rinetd.exe 通过 instsrv.exe/srvany.exe 注册服务实现稳定端口转发
  14. Windows下制作DOS启动U盘的方法
  15. (转)用Scintilla让程序支持语法高亮
  16. Android Studio+SDK+tools下载、安装、配置及应用程序运行(详细,亲测)
  17. SwiftUI调用UIKit
  18. CCS3.3相关驱动插件安装
  19. 计算机辅助翻译技术的好处,计算机辅助翻译原理与实践
  20. 加工奶制品的生产计划 lingo代码

热门文章

  1. STM32 - 定时器的设定 - 基础 - 05 - Arbitrary waveform generation using timer DMAburst feature - 任意波形的序列产生
  2. 浙江移动智能语音服务器,接口说明
  3. java定义int函数_Java自定义函数的四种类型
  4. feed流和瀑布流_基础知识讲解:什么是feed流?(图文)
  5. 小米8护眼模式无效_雷军没有交代的小米9的N个细节,这篇文章全告诉你了
  6. css中的xpath,使用XPath选择CSS类
  7. modelsim10.1a安装破解说明
  8. golang mysql封装_使用Golang 封装一个Api 框架 ----- 数据库操作篇(gorm引入)
  9. python 测试mysql数据库_Python MySQL 数据库之测试索引
  10. java buqi_Java 异常