剑指offer—第二章算法之快速排序
算法:排序和查找(二分查找,归并排序,快速排序),位运算等。
查找:顺序查找,哈希查找,二叉排序树查找,哈希表。
二分查找可以解决:"旋转数组中的最小数字","数字在排序数组出现的次数"等问题。
哈希表:优点: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—第二章算法之快速排序的更多相关文章
- 剑指offer—第二章算法之二分查找(旋转数组的最小值)
旋转数组的最小数字 题目:把一个数组最开始的若干元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如:数组{3,4,5,1,2}为{1,2,3,4, ...
- 剑指offer第二章
剑指offer第二章 1.二维数组中的查找 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含 ...
- 剑指Offer——二分查找算法
剑指Offer--二分查找算法 前言 本片博文主要讲解查找算法的相关知识.重点介绍二分查找. 二分查找算法是在有序数组中用到的较为频繁的一种查找算法,在未接触二分查找算法时,最通用的一种做法是,对数组 ...
- 《剑指offer(第二版)》面试题55——判断是否为平衡二叉树
一.题目大意 输入一颗二叉树,判断该二叉树是否为平衡二叉树(AVL树). 二.题解 <剑指offer>上给出了两种解决方式: 1.第一种是从根节点开始,从上往下遍历每个子节点并计算以子节点 ...
- 《剑指offer 第二版》题解
剑指Offer 按题号排序 面试题 3:数组中重复的数字 面试题 4:二维数组中的查找 面试题 5:替换空格 面试题 6:从头到尾打印链表 面试题 7:重建二叉树 面试题 8:二叉树的下一个节点 面试 ...
- 经典面试题目——找到第n个丑数(参考《剑指offer(第二版)》面试题49)
一.题目大意 给你一个数n,要求返回第n个丑数.其中,丑数的定义如下: 丑数是指只包含因子2.3和5的数.(数字1也是丑数,不过是个特例)引用<剑指offer>上的话来说,对于一个数M,如 ...
- 《剑指offer(第二版)》——面试题36:二叉搜索树与双向链表
具体的题目大意和参考思路在此处不详述(见<剑指offer>),实质就是在中序遍历的过程中调整指针的指向,关于中序遍历有递归和非递归两种操作,所以此处也用了两种方法. 方法1(递归法): 代 ...
- 《剑指offer(第二版)》面试题60——n个骰子的点数
一.题目描述 把n个骰子仍在地上,所有的骰子朝上的一面的点数之和为s,输入n,打印出s所有可能的值出现的概率. 二.题解 <剑指offer>上给出的两种方法,尤其是代码,晦涩难懂且没有注释 ...
- 《剑指offer(第二版)》面试题64——求1+2+...+n
一.题目描述 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字以及条件判断语句 (即三元运算符,A? B : C) 二.题解 虽然求和问 ...
随机推荐
- [CTSC2008]祭祀
题目描述 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组成的网络.每条河 ...
- 20145235李涛《网络对抗》Exp8 Web基础
基础问答 什么是表单 可以收集用户的信息和反馈意见,是网站管理者与浏览者之间沟通的桥梁. 表单包括两个部分:一部分是HTML源代码用于描述表单(例如,域,标签和用户在页面上看见的按钮),另一部分是脚本 ...
- 多线程、多进程、协程、IO多路复用请求百度
最近学习了多线程.多进程.协程以及IO多路复用,那么对于爬取数据来说,这几个方式哪个最快呢,今天就来稍微测试一下 普通方式请求百度5次 import socket import time import ...
- hibernate——第一次简单的使用
提前有jdk.mysql.hibernate必须jar包.mysql连接jar包 mysql中的表 Java中的bean,User类 package com.xiaostudy.demo; publi ...
- mysql——主键自动增长&唯一索引
首先说一下主键和唯一索引的区别 主键:一个数据库的一张表有且仅有一个主键,而且主键不能重复 唯一索引:一个数据库的一张表上唯一索引可以有多个,只是所在唯一索引上的值不能重复,这一点和主键一样 下面我们 ...
- openlayers2地图控件扩展:要素删除DeleteFeature
实现要素删除控件,扩展OpenLayers.Control类,实现效果:选择DeleteFeature工具后,选择要素,按delete键删除要素(这里的删除只是将feature设置成delete状态, ...
- 红米手机.驱动.XP安装
1.发现 官网上下载的 驱动在 XP下安装不上去... (Win7 记得 貌似 没有问题...) 1.1.网上搜到的 解决方案为:解决手机不能连电脑 XP系统无法安装MTP设备驱动的终极解决_小米No ...
- ZZ__知识点
1. DLL_PROCESS_ATTACH.DLL_PROCESS_DETACH 打印出相关信息 发现,Java Project 项目中,DLL 在 System.loadLibrary(...) 载 ...
- istringstream 用法
istringstream 类用于执行C++风格的串流的输入操作 istringstream用空格作为字符串分隔符 #include <iostream>#include <sstr ...
- EF6 Code First 系列 (四):SQLite的DropCreateDatabaseIfModelChanges和乐观并发控制
没什么好说的,能支持DropCreateDatabaseIfModelChanges和RowVersion的Sqlite谁都想要.EntityFramework7正在添加对Sqlite的支持,虽然EF ...