快速排序算法研究

快速排序算法,在剑指offer里面的一种实现:

算法的整体采用递归,将数组分成两部分,前面一部分都比后面那部分的值小,而将这两部分再接着进行递归的排序.

这其中最重要的是怎么去将其分成两部分,剑指offer上的办法是采用从前往后的遍历,将最后一个值end处作为中间的关键字,然后两个指针,一个是遍历的index,一个是比它小的个数small.

而在大话数据结构中采用的是两边往中间的方法方法来将数组分成两部分.low和high分别的low++和high--.要是low处值大于关键值,将low处值与high处值交换,要是high处的值比关键值小.将high处的值与low处的值交换.直到low与high相遇,就退出循环,而这个时候的low=high且为其中间的关键值得下标.

#include <iostream>
#include<vector>
#include<time.h>
#include<stdlib.h>

using namespace std;
int randnum(int a,int b);
void swapd(int *a,int *b);

//实现一个函数:将一个数组分成两半,在中间某处,左边都比右边要小
//返回的这个中间处的坐标号。
int partion(int vec[],int len,int start,int end)
{
	int index=randnum(start,end);
	swapd(&vec[index],&vec[end]);

	int small=start-1;
	//将最后的那个数作为中间字,将比它小的放在它前面,比它大的放在它后面。
	for(index=start;index<end;++index)
	{
		if(vec[index]<vec[end])
		{
			++small;
			if(small!=index)//若index处的值比end处的值小,就应该把它放在前面去。
				swapd(&vec[small],&vec[index]);
		}
	}
	if(small!=index)
		swapd(&vec[small],&vec[index]);
	return small;
}

int randnum(int a,int b)
{
	srand((unsigned)time(NULL));
	return (rand()%(b-a+1))+a;
}

void swapd(int *a,int *b)
{
	int temp;
	temp=*a;
	*a=*b;
	*b=temp;
}

//快排的整体思路,将数组分成两部分,前面的一部分都比后面一部分的值小,然后递归下去,
//一直到全部排好序。
void kuaipai(int vec[],int n,int start,int end)
{
	if(start==end)
		return;
	int mid=partion(vec,n,start,end);
	if(mid>start)
		kuaipai(vec,n,start,mid-1);//将前面那部分再接着进行排序
	if(mid<end)
		kuaipai(vec,n,mid+1,end);//将后面那部分再接着排序。
	return;
}
int main()
{
	//cout<<randnum(1,8)<<endl;
}

  

时间: 2024-10-08 19:35:11

快速排序算法研究的相关文章

算法研究之快速排序

快 速排序(Quicksort)是对冒泡排序的一种改进.由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然 后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 以上摘自百度百科. 最坏时间复杂度: O(n二次方); 最好时间复杂度: O(n); 快速排序的基本思想 1.分解: 在D[i...j...n]的数据中,找一个基准点D[j],

算法研究之快速排序java版

很早之前就已经接触过快速排序算法了,面试当中也屡屡被问到,虽然明白其原理,但从未真正的用代码敲出来. 写关于算法的代码之前一定要原理想明白,不然就是盲目,在参考有关资料及自己的沉思之后,写出如下代码,中间出现了一些bug,但都很快解决了 如果有更好的优化算法,还请不吝赐教!!!! 源代码: package com.zken.test; /** * @author iamzken * 排序算法 * 使用快速排序算法对一个数组从小到大排序 * 2015-8-27 13:40 */ public cl

关于快速排序算法(一个90%的人都不懂其原理、99.9%的人都不能正常写出来的算法.)

一.奇怪的现象 研究快速排序很久了,发现一个古怪的实情:这算法描述起来很简单,写一个正确的出来实在不容易.写一个优秀的快速排序算法更是难上加难. 也难怪该算法提出来过了很久才有人写出一个正确的算法,过了很久才优秀的版本出来. 二.原理描述 从数列中挑出一个元素,称为 "基准"(pivot), 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边).在这个分区退出之后,该基准就处于数列的中间位置.这个称为分区(partition)操作

快速排序算法的两个写法

快速排序作为应用比较广泛,而且时间复杂度比较优越的排序算法备受大家的喜爱.最近有点悠闲,就又把这个快速算法研究了一遍,目前掌握了两种排序算法的思路,为了以免忘记,故详细的记录下来,也供大家学习借鉴,不足之处望请指教. 快速排序的基本原理: 假设一个待排序的数组如上图所示,排序的目的就是将其从小到大排序.快速排序的主要步骤就是设定一个待排序的元素(称作主元,记作temp),经过一轮划分排序后在这个主元左边的元素值都小于它,在主元右边的元素值都大于它,一轮划分后的效果应该是这样的,如下图: 这样以t

快速排序算法小结

         快速排序是对冒泡排序的一种改进.它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列.          假设要排序的数组是a[6],长度为7,首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一躺快速排序.一躺快速排序的算法是: 1).设

排序算法之 Java简单快速排序算法

package net.qh.test.sort; import java.util.ArrayList; import java.util.Calendar; import java.util.List; /** * Created by Administrator on 2016/03/01. */ public class SimpleQuick { public int[] sort(int[] arr,int left,int right){ if ( arr == null || a

快速排序算法

快速排序的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的. 稳定性:快速排序是不稳定的排序 时间复杂度: 最好:O(nlogn) 最差:O(n^2) 辅助空间:O(logn) ~ O(n) /* 快速排序算法 */ #include <cstdio> /* 对给定的闭区间进行快速排序 */ void QSort(int* L, int low, int high){ if (low

基本算法研究1-冒泡排序算法测试

基本算法研究1-冒泡排序算法测试 1.经典冒泡排序法基本原理 先看一个动态图,感觉比较形象: 冒泡排序(Bubble Sort)是一种简单的排序算法.默认是从小到大排序,即把最大的数据排在最后,相当于每次把最大数据像气泡一样浮到水面一样.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换. 基本步骤: 1.比较相邻的元素.如果第一个比第二个大,就交换他们两个.        2.对每一对相邻元素作同样的工作,从开始第一对

HTML5游戏开发-扫雷及其算法研究

吕蒙曰:士隔三月[1],当刮目相看.所以,在下在这三月中发奋图强,花了约莫8节信息课的时间研究扫雷.呜呼,由于在下才能尚且不足,所以也就只能勉强打过中级难度的吧.不过,一边玩的同时,我还一边对扫雷这个游戏的制做方法构思了一下.所以说,本文中的算法完全是凭借自己对扫雷游戏规则的总结而自行研发出来的,倘若和MS的扫雷玩法有些出入,还望各位看官见谅. [1]出自<孙权劝学>,原文为"士别三日",由于在下这三个月来都不曾发表博客,所以引申到"士隔三月",各位看官