算法:排序和查找(二分查找,归并排序,快速排序),位运算等。

查找:顺序查找,哈希查找,二叉排序树查找,哈希表。

二分查找可以解决:"旋转数组中的最小数字","数字在排序数组出现的次数"等问题。

哈希表:优点:O(1)时间内查找一个元素的效率最高。

缺点:需要额外的空间来实现哈希表。

二叉排序树查找:对应二查搜索树查找,可以解决:"二叉收索树的后续遍历","二查搜索树和双向链表"

排序:排序算法要熟练,额外空间消耗,平均时间复杂度和最差时间复杂度比较算法直接的优缺点。

快速排序:总体平均效率最好,但是并不总是,对于已排好序的数组,每一轮排序都要以最后一个做标准。时间复杂度为O(n2)

思路:关键在于在数组中选择一个数字a(随机选择),把数组中小于a的数移到a的左边,大于a的数移到a的右边。

实现函数为int partition(int a[],int length,int start,int end){如果length小于等于0或start小于等于0或end大于length或a为空。抛空异常。用int RandomInRange(int start,int end){如果end>start{srand(time(NULL)),return start+rand()%(end-start)}}随机生成函数,生成index。用void swap_element(int *a,int*b)来交换,index和end处的值。定义一个整形变量small(指向最终存放最初的index指向的枢纽值),并初始化。将index初始化并赋值为start。当index满足index<end时,if(a[index]<a[end]){++small;if(index!=small)交换index和small处得 值。并将index++。}。++small,将比枢纽值小的数都放在了此时small指针的前面,交换end和small处的值。}

partition函数可以用于解决:长队为n数组中查找第K大的数字或最小的K个数,或者数组中出现次数超过一半的数字。

实现快排的函数为 void QuickSort(int a[],int length,int start,int end){如果start==end。返回空。通过partition函数确定第一趟排序后枢纽值index的位置。if(index>start)递归调用QuickSort对左边排序。if(index<end)递归调用QuickSort对右边排序。}

#include<iostream>
using namespace std;
#include<time.h>
int RandomInRange(int start ,int end)
{
if(end>start)
{
srand(time(NULL));// srand函数是随机数发生器的初始化函数,使得随机数种子随时间的变化而变化
return start+rand() %((end-start));//产生start~end之间的随机数
}
return 0;
}
void swap_element(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
} int Partition(int data[],int length,int start,int end)
{
if(data==NULL || length<=0||start<0 || end>=length)
{
cout<<"error1!"<<endl;
exit(0);
}
int index=RandomInRange(start,end); swap_element(&data[index],&data[end]);
int small=start-1;
for(index=start;index<end;index++)
{
if(data[index]<data[end])
{
++small;
if(small != index)
{
swap_element(&data[index],&data[small]);
}
}
}
++small;
swap_element(&data[small],&data[end]);
return small;
}
void Quicksort(int data[],int length,int start,int end)
{
if(start==end)
{
return ;
}
int index=Partition(data,length,start,end);
if(index>start)
Quicksort(data,length,start,index-1);
if(index<end)
Quicksort(data,length,index+1,end);
}
int main(void)
{
int data[10]={1,4,7,0,6,10,3,8,2,9};
Quicksort(data,10,0,9);
for(int i=0;i<10;i++)
cout<<data[i]<<" ";
cout<<endl;
return 0;
}

剑指offer—第二章算法之快速排序的更多相关文章

  1. 剑指offer—第二章算法之二分查找(旋转数组的最小值)

    旋转数组的最小数字 题目:把一个数组最开始的若干元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如:数组{3,4,5,1,2}为{1,2,3,4, ...

  2. 剑指offer第二章

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

  3. 剑指Offer——二分查找算法

    剑指Offer--二分查找算法 前言 本片博文主要讲解查找算法的相关知识.重点介绍二分查找. 二分查找算法是在有序数组中用到的较为频繁的一种查找算法,在未接触二分查找算法时,最通用的一种做法是,对数组 ...

  4. 《剑指offer(第二版)》面试题55——判断是否为平衡二叉树

    一.题目大意 输入一颗二叉树,判断该二叉树是否为平衡二叉树(AVL树). 二.题解 <剑指offer>上给出了两种解决方式: 1.第一种是从根节点开始,从上往下遍历每个子节点并计算以子节点 ...

  5. 《剑指offer 第二版》题解

    剑指Offer 按题号排序 面试题 3:数组中重复的数字 面试题 4:二维数组中的查找 面试题 5:替换空格 面试题 6:从头到尾打印链表 面试题 7:重建二叉树 面试题 8:二叉树的下一个节点 面试 ...

  6. 经典面试题目——找到第n个丑数(参考《剑指offer(第二版)》面试题49)

    一.题目大意 给你一个数n,要求返回第n个丑数.其中,丑数的定义如下: 丑数是指只包含因子2.3和5的数.(数字1也是丑数,不过是个特例)引用<剑指offer>上的话来说,对于一个数M,如 ...

  7. 《剑指offer(第二版)》——面试题36:二叉搜索树与双向链表

    具体的题目大意和参考思路在此处不详述(见<剑指offer>),实质就是在中序遍历的过程中调整指针的指向,关于中序遍历有递归和非递归两种操作,所以此处也用了两种方法. 方法1(递归法): 代 ...

  8. 《剑指offer(第二版)》面试题60——n个骰子的点数

    一.题目描述 把n个骰子仍在地上,所有的骰子朝上的一面的点数之和为s,输入n,打印出s所有可能的值出现的概率. 二.题解 <剑指offer>上给出的两种方法,尤其是代码,晦涩难懂且没有注释 ...

  9. 《剑指offer(第二版)》面试题64——求1+2+...+n

    一.题目描述 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字以及条件判断语句 (即三元运算符,A? B : C) 二.题解 虽然求和问 ...

随机推荐

  1. Chrome浏览器快捷键

    Chrome窗口和标签页快捷键:Ctrl+N 打开新窗口 Ctrl+T 打开新标签页 Ctrl+Shift+N 在隐身模式下打开新窗口 Ctrl+O,然后选择文件 在谷歌浏览器中打开计算机上的文件 按 ...

  2. APP测试的要点

    APP测试要点 功能性 UI界面 安装与卸载 升级 登录测试 离线测试 安全性测试 兼容性(操作系统,屏幕尺寸,分辨率,厂家) 消息推送 前后台切换 网络环境(wifi/2G/3G/4G/无网) 异常 ...

  3. Python3.x:Linux下退出python命令行

    Python3.x:Linux下退出python命令行 退出命令: quit() #或者 exit() #或者 Ctrl-D

  4. 使用AutoIT检测已安装软件,并将结果保存在桌面

    $file = "\adobe安装列表.txt" $regedit1 = "hklm64\SOFTWARE\Wow6432Node\Microsoft\Windows\C ...

  5. InterruptedException异常

    本文总结自:https://blog.csdn.net/asdfsadfasdfsa/article/details/78808131 什么样的方法会抛出InterruptedException异常? ...

  6. hbase 异常

    1.org.apache.hadoop.hbase.ipc.CallTimeoutException a.出现情况描述:使用java API进行hbase数据的scan操作,发现有的数据可以scan到 ...

  7. iOS字符串处理

    拼接字符串 NSString* string; NSString* string1, string2; //方法1. string = [NSString initWithFormat:@" ...

  8. 联合体union

    1.一般而言,共用体类型实际占用存储空间为其最长的成员所占的存储空间: //4*7==282.若是该最长的存储空间对其他成员的元类型(如果是数组,取其类型的数据长度,例int a[5]为4)不满足整除 ...

  9. Spring 是什么

  10. LeetCode第[34]题(Java):Search for a Range

    题目:搜索目标范围 难度:Medium 题目内容: Given an array of integers nums sorted in ascending order, find the starti ...