快排(golang实现) 递归方法
递归方法,逻辑简洁清晰。这个算法还是很重要的,需要重点记忆理解,面试经常考手写。据说是与傅里叶变换等并称“20世纪十大算法”。https://blog.csdn.net/v_JULY_v/article/details/6127953
快速排序算法的平均时间复杂度是 O(nlogn),最坏情况时间复杂度是 O(n^2)。
package main import (
"fmt"
) func main() {
var arr = []int{9, 4, 7, 6, 8, 3, 2, 5, 1}
fmt.Println("before", arr)
quickSort(arr, 0, len(arr)-1)
fmt.Println("after ", arr)
} /*****************************************************************************
* \author
* \date
* \brief 递归快排
* \param[in] arr:待排序切片 startIndex,endIndex:起始,结束索引
* \param[out]
* \return 输入返回值描述
* \ingroup 输入所属组
* \remarks
*****************************************************************************/
func quickSort(arr []int, startIndex, endIndex int) { // 递归结束条件:startIndex大等于endIndex的时候
if startIndex >= endIndex {
return
} // 得到基准元素位置
var pivotIndex = partition(arr, startIndex, endIndex) // 根据基准元素,分成两部分递归排序(分治法)
quickSort(arr, startIndex, pivotIndex-1)
quickSort(arr, pivotIndex+1, endIndex)
return
} func partition(arr []int, startIndex, endIndex int) int { // 取第一个位置的元素作为基准元素
var pivot = arr[startIndex]
var left = startIndex
var right = endIndex
for left != right { //控制right指针比较并左移
for left < right && arr[right] > pivot {
right--
} //控制right指针比较并右移
for left < right && arr[left] <= pivot {
left++
} //交换left和right指向的元素
if left < right {
arr[left], arr[right] = arr[right], arr[left]
}
} //pivot和指针重合点交换
arr[left], arr[startIndex] = arr[startIndex], arr[left]
return left
}
快排(golang实现) 递归方法的更多相关文章
- F#之旅4 - 小实践之快排
		参考文章:https://swlaschin.gitbooks.io/fsharpforfunandprofit/content/posts/fvsc-quicksort.html F#之旅4 - 小 ... 
- 快排 快速排序 qsort quicksort C语言
		现在网上搜到的快排和我以前打的不太一样,感觉有点复杂,我用的快排是FreePascal里/demo/text/qsort.pp的风格,感觉特别简洁. #include<stdio.h> # ... 
- iOS常见算法(二分法 冒泡 选择 快排)
		二分法: 平均时间复杂度:O(log2n) int halfFuntion(int a[], int length, int number) { int start = 0; int end = l ... 
- C++ 快排
		// 进行一轮快排并返回当前的中间数 int getMiddle( int* arr, int low, int high ) { auto swaparr = [&]( int i, int ... 
- 先贴上代码:Random快排,快排的非递归实现
		设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为主元,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序.值得注意的是, ... 
- Java常见的几种排序算法-插入、选择、冒泡、快排、堆排等
		本文就是介绍一些常见的排序算法.排序是一个非常常见的应用场景,很多时候,我们需要根据自己需要排序的数据类型,来自定义排序算法,但是,在这里,我们只介绍这些基础排序算法,包括:插入排序.选择排序.冒泡排 ... 
- ACM/ICPC 之 快排+归并排序-记录顺序对(TSH OJ-LightHouse(灯塔))
		TsingHua OJ 上不能使用<algorithm>头文件,因此需要手写快排(刚开始写的时候自己就出了很多问题....),另外本题需要在给横坐标排序后,需要记录纵坐标的顺序对的数量,因 ... 
- 数组第K小数问题 及其对于 快排和堆排 的相关优化比较
		题目描述 给定一个整数数组a[0,...,n-1],求数组中第k小数 输入描述 首先输入数组长度n和k,其中1<=n<=5000, 1<=k<=n 然后输出n个整形元素,每个数 ... 
- 结构体快排回顾(sort)
		一般来说,我做竞赛的时候排序一般用快排 很快很方便 普通sort(从小到大) sort(a,a+n); 直接贴一段代码吧,包含了vector,sort,结构体等简单东西综合 #include < ... 
随机推荐
- 手工执行sql tuning advisor和sql access advisor
			sql tuning advisor:创建任务DECLARE my_task_name VARCHAR2(30); my_sqltext CLOB; BEGIN my_sqltext := 'SELE ... 
- Vue.js经典开源项目汇总
			Vue.js经典开源项目汇总 原文链接:http://www.cnblogs.com/huyong/p/6517949.html Vue是什么? Vue.js(读音 /vjuː/, 类似于 view) ... 
- HttpServletRequest的随手记
			request对象的三个主要的方法: getParameter(String name):获取请求参数名字对应的参数值.只获取一个.如果名字对应有多个参数值的话,那么只会获取参数数组中的第一个.比如一 ... 
- css 17课--
			---------------------------------------------------------------------------------------------------- ... 
- springMVC框架下返回json格式的对象,list,map
			原文地址:http://liuzidong.iteye.com/blog/1069343 注意这个例子要使用jQuery,但是jquery文件属于静态的资源文件,所以要在springMVC中设置静态资 ... 
- BZOJ2342:[SHOI2011]双倍回文(Manacher)
			Description Input 输入分为两行,第一行为一个整数,表示字符串的长度,第二行有个连续的小写的英文字符,表示字符串的内容. Output 输出文件只有一行,即:输入数据中字符串的最长 ... 
- POJ 1845 Sumdiv 【二分 || 逆元】
			任意门:http://poj.org/problem?id=1845. Sumdiv Time Limit: 1000MS Memory Limit: 30000K Total Submissions ... 
- docker-1-简介
			Dockers的出现: 一款产品从开发到上线,从操作系统,到运行环境,再到应用配置.作为开发+运维之间的协作我们需要关心很多东西, 这也是很多互联网公司都不得不面对的问题,特别是各种版本的迭代之后,不 ... 
- l1 l2 loss
			衡量预测值与真实值的偏差程度的最常见的loss: 误差的L1范数和L2范数 因为L1范数在误差接近0的时候不平滑,所以比较少用到这个范数 L2范数的缺点是当存在离群点(outliers)的时候,这些点 ... 
- 视频(video)属性
			Figure 3视频相关的属性: 属性 值 描述 muted muted 定义音频的初始状态,目前仅支持muted. crossorigin 空 定义当前视频是否是一个跨域的项目. me ... 
