快速排序之C实现和JS实现的区别
快速排序是面试中的几乎必问的问题,理解之后发现并不难,在此贴出两种版本,与小伙伴们相互交流
PS:今天码代码非常有感觉,所以连发三篇博客,下午打球,手感也是热的发烫,希望不忘初心,方得始终。
进入正题,快速排序的基本思路就是的,找出数组中的某一个值,将其摆放在某一位置,比其大,放在该值的右边,比其小放在该值的左边,左右两边继续执行上述步骤,也就是递归。
那么问题来了,C语言中如何找出数组中的某一个值的位置(以下程序均取首项),先看如下分析。
C实现
如图1所示,low代表数组首项,high代码数组末项,找出数组的首项 arr[len],将其储存起来(int val=arr[len]),先比较arr[high]与arr[low] 大小,,如何arr[high]>val,high左移,
如果arr[high]>val,说明数组的顺序已调整好,否则直至arr[high]<val arr[low]=arr[high]

图1

图2
如果arr[low]<=val 将low右移,当arr[low]>val,arr[high]=arr[low]

图3
如果arr[high]>=val 将high左移,arr[high]<val,arr[low]=arr[high]

图4
如果arr[low]<=val 将low右移,当arr[low]=arr[high],则代表首项的位置找到了,为2所在位置,arr[low]=val;

图5
下来就简单了,对9所在位置的左右依次执行上述操作方法,也就是递归
代码如下:
#include <stdio.h>
void quick_sort(int * a,int low,int high);
int findPos(int * a,int low,int high);
int main(){
int i ;
int arr[]={,,,,-,,,,,,,,};
//求数组的长度
int len=sizeof(arr)/sizeof(arr[]);
//排序
quick_sort(arr,,len-);
//打印
for(i=;i<len;i++){
printf("%d ",arr[i]);
}
printf("\n");
return ;
}
/*递归函数,第一个参数是数组,第二个参数是排序起始点,第三个参数是排序终止点*/
void quick_sort(int * a,int low,int high){
//在low小于high的时候,先找出指定值的位置,本程序指定的是a[0], 在指定值的左右继续执行找位置并赋值
if(low<high){
int pos=findPos(a,low,high);
quick_sort(a,low,pos-);
quick_sort(a,pos+,high);
}
}
int findPos(int * a,int low,int high){
int val=a[low];
while(low<high){
//当a[high]大于val时,不用移动a[high],只需要让high左移,也就是high--,当a[high]<val,则证明该赋值了。
while(low<high && a[high]>=val){
high--;
}
a[low]=a[high];//跳出while执行
//当a[low]<=val,不用移动 a[low],只需要让low右移,也就是low--,当a[low]>val,则证明该赋值了。
while(low<high && a[low]<=val){
low++;
}
a[high]=a[low];//跳出while执行
}//跳出总的while 代表low==high,则只需要把val赋给 a[low]或 a[high] ,最终return low或high 作为递归分界线
a[low]=val;
return low;
}
JS实现
js实现,也是比较容易,找出一个中间值,比其小放在左边,比其大放在右边,左右递归,有一点注意,在判断与mid[0]的大小时,循环从1开始,而不是0.
伪代码:
var arr=Array.length; //长度
if(arr<=1){return arr.slice(0);}
var left=[];//左
var right=[];//右
var mid=[Array[0]];//中间值
for(var i=1;i<len;i++){
if(Array[i]<mid[0]) left.push(Array[i])
else right.push(Array[i]);
}
return left.sort.concat(mid.concat(right.sort()))//递归
用面向对象去写,就是在数组的原型上添加一个方法,测试时去调用这个方法即可
Array.prototype.quick_sort=function(){
var len=this.length;
if(len<=1){
return this.slice(0);
}
var left=[];
var right=[];
var mid=[this[0]];
for(var i=1;i<len;i++){
if(this[i]<mid[0]){
left.push(this[i]);
}
if(this[i]>=mid[0]){
right.push(this[i]);
}
}
return left.quick_sort().concat(mid.concat(right.quick_sort()));
}
var arr = [31, 1, -5, -6, 10, 9, 0, 14, 222];
arr=arr.quick_sort();
console.log(arr);
这是测试的结果

图6
比较两者区别
C实现相对于JS实现代码量能大一点,C中多了一步就是把首项的值,放到合适的位置,而JS固定好了中间值,就是第一项,比中间值小的放在中间值的左边,比中间值大的放在中间值的右边,再调用递归
快速排序的数据结构是不确定的,时间复杂度是O(n^2), 最优时间复杂度为O(n log n),平均时间复杂度也为O(n log n),空间复杂度取决于程序的实现方法。
这就是我对快排的理解。
快速排序之C实现和JS实现的区别的更多相关文章
- js == 与 === 的区别,‘’与“”的区别
js == 与 === 的区别 1.对于string,number等基础类型,==和===是有区别的 1)不同类型间比较,==之比较"转化成同一类型后的值"看"值&quo ...
- 小tips:JS数值之间的转换,JS中最大的Number是多少?,JS == 与 === 的区别
JS数值之间的转换 Number(), parseInt(),parseFloat() Number()函数的转换规则如下: 1.如果boolean值,true和false将分别被转换为1和02.如果 ...
- JQ的offset().top与js的offsetTop区别详解
一.前言 最近在做一个图片懒加载的插件,就纵轴(Y轴)而言,我需要时时获取图片的上偏移量,好判断是否已进入视图区域,而我所理解的是offsetTop应该是跟offset().top一样的,然后陷入了因 ...
- js forEach for区别
1.循环中断差别 具体见示例代码: <!DOCTYPE html> <html lang="zh"> <head> <meta chars ...
- js中单引号和双引号的区别(html中属性规范是用双引号,js中字符串规定是用单引号)(js中单引号区别和php很像:单引号快,双引号可转义字符,双引号可解析变量)
js中单引号和双引号的区别(html中属性规范是用双引号,js中字符串规定是用单引号)(js中单引号区别和php很像:单引号快,双引号可转义字符,双引号可解析变量) 一.总结 1.html中属性规范是 ...
- JQ的offset().top与JS的getBoundingClientRect区别详解,JS获取元素距离视窗顶部可变距离
壹 ❀ 引 我在 JQ的offset().top与js的offsetTop区别详解 这篇博客中详细分析了JQ方法offset().top与JS属性offsetTop的区别,并得出了一条offset( ...
- php和js的小区别
1.今天看了下php的api感觉还可以,不是很难,可能没看到深入的地方, (1)和js很相似 目前感觉它和js的最大区别 js的 点 被替换成 -> function setCate($pa ...
- JS与Jquery区别
很多人对JS和JQuery很容易搞混淆,今天我们就相比学习下: 加载区别: var myfunction(){}; JS:1.window.onload=function(){} 2.<body ...
- 浅析angular,react,vue.js jQuery使用区别
前端越来越混乱了,当然也可以美其名曰:繁荣.当新启动一个前端项目,第一件事就是纠结:使用什么框架,重造什么轮子? PS:大牛留言讨论那么,希望看完此篇,能够给你一个清晰的认识,或者让你更加地纠结和无所 ...
随机推荐
- LDA线性判别分析原理及python应用(葡萄酒案例分析)
目录 线性判别分析(LDA)数据降维及案例实战 一.LDA是什么 二.计算散布矩阵 三.线性判别式及特征选择 四.样本数据降维投影 五.完整代码 结语 一.LDA是什么 LDA概念及与PCA区别 LD ...
- gcc手动安装
Linux下: 手动安装gcc需要5个基础包 百度网盘链接:链接:包链接 密码:izxj 按照以上顺序安装:rpm -ivh 包名 为什么要手动安装呢,因为遇到这个情况:linux服务器没有权限连 ...
- vant官网无法打开,这里教你解决
是否大家和我一样,vant-weapp官网突然打不开了 像这样: 但我发现在码云上有一个国内的版本 https://vant-contrib.gitee.io/vant/#/zh-CN/home, ...
- 基于python tkinter的点名小程序
import datetimeimport jsonimport osimport randomimport tkinter as tkimport openpyxl # 花名册文件名excel_fi ...
- rlpyt(Deep Reinforcement Learning in PyTorch)
rlpyt: A Research Code Base for Deep Reinforcement Learning in PyTorch Github:https://github.com/ast ...
- Federated Optimization: Distributed Machine Learning for On-Device Intelligence
郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! arXiv:1610.02527v1 [cs.LG] 8 Oct 2016 坐标下降法:https://blog.csdn.net/qq_ ...
- Z shell (zsh) 安装
1. 安装 zsh 和一些依赖 sudo apt update sudo apt install -y zsh python-pygments autojump 2.下载推荐配置文件 3. 在家目录解 ...
- 中文、sci论文写作结构总结
全文建议:30-40篇参考文献,6-8个图,1-3表,<3000词. 一.题目 1.12~15个词,顶多18个词. 2.6个特点:specific.short.impressive.famili ...
- 数据中台实战(一):以B2B电商亿订为例,谈谈产品经理视角下的数据埋点
本文以B2B电商产品“亿订”为实例,与大家一同谈谈数据中台的数据埋点. 笔者所在公司为富力环球商品贸易港,是富力集团旗下汇聚原创设计师品牌及时尚买手/采购商两大社群,通过亿订B2B电商.RFSHOWR ...
- 从String类型发散想到的一些东西
值类型 引用类型 值类型表示存储在栈上的类型,包括简单类型(int.long.double.short).枚举.struct定义: 引用类型表示存在堆上的类型,包括数组.接口.委托.class定义: ...