排序(三)冒泡排序与快速排序(C语言实现)
冒泡排序与快速排序都属于交换排序,其中冒泡排序也是十分的出名,实现起来也比较简便,下面一一介绍这两种排序。
1、冒泡排序
冒泡排序的意思就是将最大的数沉底,或者最小的数提到最前面来,之后再抛开这个数找次大或此次小的数进行循环,这个过程比较像泡泡从小变大的过程因此称作冒泡排序。
代码实现:
void BubbleSort(int* a, int n)
{assert(a);//断言判断for (int j = 0; j < n; j++){int flag = 0;//用于提高循环效率,如果提前排序完成,则不用再继续进行比较//置flag为1后便可跳出循环for (int i = 1; i < n - j; i++){if (a[i - 1] > a[i])Swap(&a[i - 1], &a[i]);flag = 1;}if (flag == 0)break;}
}
2、快速排序
快速排序正如其名,效率非常的快,但是算法比较复杂,要求使用递归思想。
我们先来看单趟的排序过程:
首先要选定一个值为key(一般都选择数组最左端或最右端的值),让所有比key小的值在key左边,比key大的值在key右边(以下为升序思路)
这里取最左端的值为key,接下来就是先从右边开始依次遍历数组寻找比key小的数
此时right所在下标的值比key大,则再从左边开始找比key大的数
交换left与right所对应的值
之后再重复以上步骤直到left与right相遇为止
最后将left所对应的值与key交换(如果选取左边为key一定要从右边开始找,这样可以保证left最后所在位置一定比key小或等于key)
这时整个数组被分为三个区间其所对应的下标分别是[begin,key-1]key[key+1,end],其中key所在位置不用再变化,而要分别对左右两个区间再进行单趟快速排序
左:
右:
因为取的数据比较巧,也只花了一次就完成排序了,没有体验出一个递归的过程,不过我们可以思考如果这一次排完还是无序便又要拆分成左右区间继续排序,直到区间只剩一个数或者不存在为止。
那么用代码来实现一下:
void QuickSort(int* a, int begin, int end)
{//当区间只有一个值或不存在则不需要再处理if (begin >= end){return;}int left = begin;int right = end;int key = left;while (left < right){//右边先走,找小while (left < right && a[right] >= a[key])//这里是第一个判断条件是防止left不动,right一直向左走越界的情况//第二个判断条件的等于号一定不能少,如果左右都与key相等会死循环{right--;}//左边再走,找大while (left < right && a[left] <= a[key]){left++;}Swap(&a[right], &a[left]);}Swap(&a[left], &a[key]);//key取左边,右边先走一定能保证结束循环后left所在位置的值比key小key = left;//[begin,key-1]key[key+1,end],此时需要让key左右区间分别有序QuickSort(a, begin, key - 1);QuickSort(a, key + 1, end);//递归思想
}
排序(三)冒泡排序与快速排序(C语言实现)相关推荐
- 程序员必知的8大排序(三)-------冒泡排序,快速排序(java实现) .
http://blog.csdn.net/pzhtpf/article/details/7560294 5.冒泡排序 (1)基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相 ...
- 10种排序算法比较(直接插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序、基数排序、折半插入排序、2路插入排序)
本文(所有排序算法代码+综合比较代码)链接:https://download.csdn.net/download/qq_39932172/11217572 一.比较目的: 由于<数据结构> ...
- c语言入门中冒泡排序的例题,选择排序和冒泡排序例题解析(c语言)
排序算法排序算法 1.简单选择排序简单选择排序 假设有 n 个数,作简单选择排序简单选择排序,按升序排列: 先通过 n-1 次比较,从 n 个值中找出最小值,将它与第一个值交换. 再通过 n-2 次比 ...
- 【排序】冒泡排序与快速排序(三个版本+非递归图示详解哦)
全文目录 引言 冒泡排序 快速排序 思路 实现 Hoare版本 快排优化 挖坑法 前后指针法 快排非递归版本 思路 实现 总结 引言 在这篇文章中,将继续介绍排序算法:冒泡排序与快速排序: 它们都属于 ...
- c语言快速排序算法马桶,学习算法 -- 马桶排序、冒泡排序和快速排序
目录 马桶排序(令人作呕的排序) 冒泡排序(面试都要问的算法) 快速排序(见证亚当和夏娃的爱情之旅) 马桶排序(令人作呕的排序) 一.场景:期末考试完了,老师要将同学们的分数从高到低排序.假设班上有 ...
- 数据结构和算法系列5 七大排序之冒泡排序和快速排序
排序是我们生活中经常会面对的问题.同学们做操时会按照从矮到高排列:老师查看上课出勤情况时,会按学生学号顺序点名:高考录取时,会按成绩总分降序依次录取等.排序是数据处理中经常使用的一种重要的运算,它在我 ...
- 常见排序算法详解(插入排序、希尔排序、选择排序、冒泡排序、快速排序)
1.1 插入排序 步骤: 1.从第一个元素开始,该元素可以认为已经被排序 2.取下一个元素tem,从已排序的元素序列从后往前扫描 3.如果该元素大于tem,则将该元素移到下一位 4.重复步骤3,直到找 ...
- 排序下---(冒泡排序,快速排序,快速排序优化,快速排序非递归,归并排序,计数排序)
排序上 排序上 交换类排序 基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动. ...
- (经典实用五大排序)选择排序,计数排序,冒泡排序,快速排序,插入排序
选择排序代码段 void SelectionSort(int a[], int size)//a数组,数组长度 {for (int i = 0;i < size - 1;i++)//选择排序:默 ...
- 我的Java学习之路(第十九天)------ 排序算法(冒泡排序、快速排序)
(参考:尚硅谷_宋红康_Java语言基础) 文章目录 数组的冒泡排序 数组的快速排序 数组的冒泡排序 package de1;public class Test2 {public static voi ...
最新文章
- android 反编译
- SQL SERVER 2012 OBJECT_ID
- 通过Spring Social推特StackExchange –第1部分
- Spring在tomcat下使用JTA事务
- System V消息队列
- 【Unity3D】UGUI之Dropdown
- 大规模MIMO多用户系统中的导频调度和预编码方法
- 人生最重要的概念:复利
- HHL,AL;非结合朱顶红凝集素(HHL,AL)
- 原来互联网公司想裁员还能这样玩?
- 关于 centos 7系统,iptables透明网桥实现
- 30年历史回顾,Jeff Dean:我们整理了一份「稀疏专家模型」研究综述
- 计算机网络实验--Cisco Packet Tracer 实验
- Eclipse Neno.3 + Jrebel 7.0.9 图文在线安装
- yum是干什么的_linux下的yum命令详解
- Microsoft Visusl C++2010运行程序时,调试弹出黑框自动闪退无法看见运行结果的解决方法
- 从户外露营到登陆火星,火星玩家电核装备让太空黑科技成为现实
- android传感器介绍
- 浅尝辄止_数学建模(笔记_时间序列分析及其SPSS实现)
- 快速的绘制一幅可爱的柯基犬插图教程