快排思路

这里采用传统的方法,没有采用剑指Offer书上的方法。

Java版的比较干净,舍去了不必要的判断和操作,以Java版为准。

  • 排序函数(全部采用闭区间):

    当区间为null或者左指针>=右指针位置 return;//

    partition 当前区间,得到随机枢轴元素的idx。

    对idx分成的左右区间排序。
  • partition函数

    在当前区间,(随机选取一个元素和第一个元素置换),选第一个元素作为枢轴元素,确定它的位置(比它小于等于的放左边,比它大于等于的放右边)

    具体的,采用“东拆西补”的思想,while(i!=j){

    从右遍历找到比枢轴元素小的元素,放到i指向的位置,空出j位置;

    从左遍历找到比枢轴元素大的位置,放到j指向的位置,空出i位置;

    }

    arr[i]=枢轴元素

    return i

其他知识点

生成一个范围内随机数

见代码,这里为包含左右两端点。

srand((unsigned)time(0))用来随机生成随机数种子。rand()生成随机数。

数组做形参

数组具有不能传值的特性,当把数组作为形参,实际是把指向数组首元素的地址作为参数传递。

int partition(int *num,int start,int end)

int partition(int num[],int start,int end)

待解决

异常的解决还需要改,

现在遇到异常会输出:terminating with uncaught exception of type char const*

代码(Java)

public class QuikSort {
public static void main(String[] args) {
int[] arr= {4,5,7,2,2,3};
quickSort(arr,0,arr.length-1);
for(int num:arr) {
System.out.println(num);
}
} public static void quickSort(int[] arr,int low,int high) {
if(arr==null||low>=high) {//
return;
}
int idx=partition(arr,low,high);
quickSort(arr,low,idx-1);
quickSort(arr,idx+1,high);
} public static int partition(int[] arr,int low,int high) {
int key=arr[low];
int i=low;
int j=high;
while(i<j) {
while(i<j&&arr[j]>=key) {//
--j;
}
arr[i]=arr[j];//包含i、j相等情况
while(i<j&&arr[i]<=key) {
++i;
}
arr[j]=arr[i];
}
arr[i]=key;
return i;
}
}

代码(C++)

#include <iostream>
#include <time.h> using namespace std; int randomInRange(int start,int end){
if(end<start){
throw "Invaild paramters of randomInRange";
}
else{
srand((unsigned)time(0));
return start+rand()%(end-start+1);//对数据个数求余
}
} void swap(int &a,int &b){//注意
int temp=a;
a=b;
b=temp;
} int partition(int *num,int start,int end){
if(num==nullptr||start<0||(end-start)<0){//注意end-start=0可以;书上partition加了数组长度的形参
throw "Invaild paramters of partition";//,并要限制数组的长度大于0以及end在范围内,这里未做。
}
int index=randomInRange(start, end);
swap(num[index], num[start]);
int tempElm=num[start];
int i=start;
int j=end;
while(i<j){
while(i<j&&num[j]>=tempElm){//注意>=,因为等于基准元素的元素分在它的左右两边都可以
--j;
}
if(i!=j){
num[i]=num[j];
++i;
}
while(i<j&&num[i]<=tempElm){//注意>=
++i;
}
if(i!=j){
num[j]=num[i];
--j;
}
}
num[i]=tempElm;//最后一定是I j 都指向[]的位置
return i;
} void quickSort(int *num,int start,int end){
if(start==end){return;}
int index=partition(num, start, end);
if(index>start){//注意
partition(num, start, index-1);
}
if(index<end){//注意
partition(num, index+1, end);
}
} int main(int argc, const char * argv[]) {
int num[]={3,4,5,1,1,2};
int len=sizeof(num)/sizeof(int);
quickSort(num, 0, len-1);
for(int i=0;i<len;i++){
cout<<num[i]<<" "<<endl;
}
return 0;
}

reference

https://www.zybuluo.com/Ggmatch/note/1036346

https://blog.csdn.net/yuhan_9204/article/details/46427533

[剑指Offer]快排的更多相关文章

  1. 面试题目——《剑指Offer》

    1.把一个字符串转换成整数——<剑指Offer>P29 2.求链表中的倒数第k个结点——<剑指Offer>P30 3.实现Singleton模式——<剑指Offer> ...

  2. 剑指offer习题集1

    1.打印二叉树 程序很简单,但是其中犯了一个小错误,死活找不到,写代码要注意啊 这里左右子树,要注意是node->left,结果写成root->left vector<int> ...

  3. 《剑指offer》全部题目-含Java实现

    1.二维数组中的查找 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. publi ...

  4. 剑指Offer——顺丰笔试题+知识点总结

    剑指Offer--顺丰笔试题+知识点总结 情景回顾 时间:2016.10.16 19:00-20:40 地点:山东省网络环境智能计算技术重点实验室 事件:顺丰笔试 知识点总结 快排 霍尔排序(快排) ...

  5. 剑指Offer——知识点储备-常用算法

    剑指Offer--知识点储备-常用算法 快速排序 注:若排序是有序的,采用快排,则退化为冒泡排序. 解决这个问题,采用两个选取基准的方法 (1)随机选取基数(在这个区间内随机取一个数) 出现的恶劣情况 ...

  6. 剑指Offer——好未来视频面知识点储备+面后总结

    剑指Offer--好未来视频面知识点储备+面后总结 情景介绍 时间:2016.10.12 13:00- 地点:宿舍 事件:好未来视频面 知识点储备 数据结构 单链表反转 public class Li ...

  7. 剑指Offer——CVTE校招笔试题+知识点总结(Java岗)

    剑指Offer(Java岗)--CVTE校招笔试题+知识点总结 2016.9.3 19:00参加CVTE笔试,笔试内容如下: 需要掌握的知识:Linux基本命令.网络协议.数据库.数据结构. 选择题 ...

  8. 剑指Offer——贪心算法

    剑指Offer--贪心算法 一.基本概念 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解.虽然贪心算法不能对 ...

  9. Leetcode - 剑指offer 面试题29:数组中出现次数超过一半的数字及其变形(腾讯2015秋招 编程题4)

    剑指offer 面试题29:数组中出现次数超过一半的数字 提交网址: http://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163 ...

随机推荐

  1. LeetCode OJ 145. Binary Tree Postorder Traversal

    Given a binary tree, return the postorder traversal of its nodes' values. For example:Given binary t ...

  2. 树莓派上的软件安装和卸载命令汇总 [ZT]

    转自:http://www.eeboard.com/bbs/thread-40823-1-1.html基础命令 安装软件 apt-get install softname1 softname2 sof ...

  3. ArcGIS Python编程案例-电子资料链接

    ArcGIS Python编程案例(1)-Python语言基础 https://www.jianshu.com/p/dd90816d019b ArcGIS Python编程案例(2)-使用ArcPy编 ...

  4. hdu2669-Romantic-(扩展欧几里得定理)

    Romantic Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  5. js高级-原型链

    JavaScript是基于原型的面向对象的语言(相当于一个基类,父类),而不是像Java通过类模板构造实例,通过原型实现属性函数的复用 函数都有 prototype属性 指向函数的原型对象 只有函数根 ...

  6. 从后台获取的数据渲染到页面中的dom操作

    很多情况下页面dom都是从后台拼接字符串添加生成的新的dom元素,在编辑器中不能看到,只能通过检查看到页面的dom结构,但是这时候会发生一个问题,就是如果使用jQuery无法进行dom操作,事件和方法 ...

  7. table-cell http://www.cnblogs.com/StormSpirit/archive/2012/10/24/2736453.html

    http://www.cnblogs.com/StormSpirit/archive/2012/10/24/2736453.html

  8. substring 比较(c#和Java)

    Java中 string str = "123456"; str .substring(5); 结果:6 Substring(A)表示从原字符串的指定索引号A开始截取直到原字符串的 ...

  9. 理解 IAAS、PAAS、SAAS

    引用:http://cloud.51cto.com/art/201802/565858.htm 在与相关人士聊云计算的时候,有时会从他们的最终蹦出诸如IaaS.PaaS和SaaS等相关名词,听的人一头 ...

  10. python学习 day23 面向对象三大特性之继承

    ### 面向对象三大特性值继承#### 1.什么是继承 继承是一种关系,必须存在两个对象才可能产生这种关系,在现实生活中的继承,王思聪可以继承王健林的财产 被继承的成为父,继承的一方成为子 在程序中, ...