在上一篇文章:高级排序之分割法中介绍分割法的基础上,做一个递归就是现在介绍的快速排序!快速排序的原理就是将数组以某个基准值进行分割,左边是小于这个基准值的数列,右边是大于这个基准值的数列,再通过递归,就可以把原数组进行排序了

#include<stdio.h>
#define MAX 10000int A[MAX],n;int mypartition(int left,int right)
{int x,i,j,t;x=A[right];//最后一个元素作为分割的基准i=left-1;for(j=left; j<right; j++){if(A[j]<x) //比基准值小的交换A[i]与A[j]{i++;t=A[i];A[i]=A[j];A[j]=t;}}t=A[i+1];A[i+1]=A[right];A[right]=t;//最后把基准值与A[i+1]交换即可return i+1;
}void myQuickSort(int left,int right)
{int q;if(left<right){q=mypartition(left,right);myQuickSort(left,q-1);myQuickSort(q+1,right);}
}int main()
{int i,q;printf("输入数组的长度:");scanf("%d",&n);for(i=0; i<n; i++){scanf("%d",&A[i]);}myQuickSort(0,n-1);for(i=0; i<n; i++){if(i){printf(" ");}printf("%d",A[i]);}printf("\n");return 0;
}

void myQuickSort(int left,int right)
{
    int q;
    if(left<right)
    {
        q=mypartition(left,right);
        myQuickSort(left,q-1);
        myQuickSort(q+1,right);
    }
}

通过递归将左边的和右边的再进行分割,重复分割,直到排序完成!

再来看一个示例,看下快速排序是不是稳定排序,以扑克牌的数值顺序来排序:

#include<stdio.h>
#define MAX 10000struct Card
{char suit;//花色【Spade黑桃、Heart红心、Club梅花、Diamond方块】int value;//数值
};int mypartition(struct Card A[], int left,int right)
{struct Card x,t;//卡片的基准变量和临时变量int i,j;x=A[right];//最后一个元素作为分割的基准i=left-1;for(j=left; j<right; j++){if(A[j].value<x.value) //比基准值小的交换A[i]与A[j]中的value值{i++;t=A[i];A[i]=A[j];A[j]=t;}}t=A[i+1];A[i+1]=A[right];A[right]=t;//最后把基准值与A[i+1]交换即可return i+1;
}void myQuickSort(struct Card A[],int left,int right)
{int q;if(left<right){q=mypartition(A,left,right);myQuickSort(A,left,q-1);myQuickSort(A,q+1,right);}
}int main()
{int n,i,v;struct Card A[MAX];char S[10];//花色printf("输入数组的长度:");scanf("%d",&n);for(i=0; i<n; i++){scanf("%s %d",S,&v);A[i].suit=S[0];//取花色第一个字母A[i].value=v;//数值}myQuickSort(A,0,n-1);for(i=0; i<n; i++){printf("%c %d\n",A[i].suit,A[i].value);}return 0;
}

我们看到的结果是不稳定排序

高级排序之快速排序(分割与整合)相关推荐

  1. 9个元素换6次达到排序序列_(算法四)高级排序(快速排序)

    1.快速排序 快速排序是对冒泡排序的一种改进.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速 ...

  2. 数据结构与算法之--高级排序:shell排序和快速排序

    高级排序比简单排序要快的多,简单排序的时间复杂度是O(N^2),希尔(shell)排序大约是O(N*(logN)^2),而快速排序是O(N*logN). 说明:下面以int数组的从小到大排序为例. 希 ...

  3. 【数据结构与算法】高级排序(希尔排序、归并排序、快速排序)完整思路,并用代码封装排序函数

    本系列文章[数据结构与算法]所有完整代码已上传 github,想要完整代码的小伙伴可以直接去那获取,可以的话欢迎点个Star哦~下面放上跳转链接 https://github.com/Lpyexplo ...

  4. 数据结构(七)高级排序算法——归并、快速排序

    一.归并排序 1.排序原理 归并排序算法是一种利用了分治算法思想实现的排序算法,这种排序算法是基于有序数组合并的归并排序算法的基本思想就是:判断一个待排序序列的长度,只要这个待排序序列的长度是超过1的 ...

  5. 希尔排序、快速排序、归并排序的实现分析以及时间复杂度

    高级排序 希尔排序 快速排序 归并排序 希尔排序 希尔排序是插入排序的一种,又称"缩小增量排序",是插入排序算法的一种更高效的改进版本. 我在另一篇文章中说插入排序的时候,会有一个 ...

  6. 算法---排序--希尔排序和快速排序

    冒泡.选择.插入排序算法是三种简单的排序算法,它们的时间复杂度大O表示法都是O(N2),如果数据量少,我们还能忍受,但是数据量大,那么这三种简单的排序所需要的时间则是我们所不能接受的.接着我们在讲解递 ...

  7. JS 排序算法详解(冒泡排序,选择排序,插入排序,希尔排序,快速排序)

    JS 排序算法详解(冒泡排序,选择排序,插入排序,希尔排序,快速排序) 一. 大O表示法 在进行排序算法之前,我们得先掌握一种对算法效率的表示方法,大O表示法. 我们使用大O表示法来表示算法的时间复杂 ...

  8. 排序算法 | 快速排序,算法的图解、实现、复杂度和稳定性分析与优化

    今天讲解一下快速排序算法的原理以及实现.复杂度和稳定性分析与优化 目录 1 快速排序的原理 2 快速排序代码实现 3 复杂度和稳定性分析.优化 4 习题练习 1 快速排序的原理 快速排序是所有内部排序 ...

  9. 排序算法--快速排序

    快速排序:快速排序(Quicksort)是对冒泡排序的一种改进.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部 ...

最新文章

  1. 谷歌 notification 测试 页面
  2. 程序员出身,身价340亿!没有他,可能我们刷不了B站
  3. 实践周java基础软件开发app之五子棋
  4. 新增记录行(ecshop)
  5. EditPlus3.21注册码
  6. 玩转oracle 11g(37):rman备份-数据库指定文件恢复
  7. Swift的笔记和参考
  8. 大数据开发初学者学习路线_初学者的Web开发路线图
  9. word页面顺序倒过来_Word里的表格,行之间的顺序如何颠倒过来?
  10. 面试Java岗位时,总被面试题困扰,分享企业爱用的面试题
  11. 序列化和反序列化的概念
  12. Ubuntu下设置Pycharm/unity的桌面快捷方式
  13. 最全中文停用词表整理(1893个)
  14. 爬去当当热销图书信息
  15. Salesforce入门教程(中文)-019 VF创建输入表单
  16. win10电脑网速慢怎么解决
  17. LM5017原理图PCB设计要点
  18. php公众号关注自动回复内容,微信公众号自动回复内容大全集锦
  19. 自媒体是什么?三大媒体平台详细介绍,不了解的赶紧看着吧!
  20. PHP中常用的十个字符串函数

热门文章

  1. Xpath在选择器中正确,在代码中返回的是空列表问题
  2. 如何将网站升级为HTTPS协议(整理)
  3. android Base64 加密
  4. H.264学习笔记2——帧内预测
  5. 模拟登录新浪微博(Python)
  6. Syzmlw 让子弹飞迅雷下载
  7. C++_类和对象_对象特性_友元_全局函数做友元_在类中声明友元权限的全局函数来访问_类中的private权限的变量---C++语言工作笔记052
  8. AndroidStudio安卓原生开发_Android扫描附近指定的蓝牙设备_通过设备名称过滤_计算距离_离扫描设备近的显示的时候放在前面---Android原生开发工作笔记128
  9. ES6新特性_ES6语法糖-子类对父类方法的重写---JavaScript_ECMAScript_ES6-ES11新特性工作笔记037
  10. STM32工作笔记006---常见硬件介绍-以及常见术语--随时更新