DSA-interview-快速排序笔记

http://blog.csdn.net/morewindows/article/details/6684558#

默写:(错误用黄色标出)

int partition(int s[], int left, int right)
{
	int i = left;
	int j = right;
	int x = s[0];--------应该为s[left]----不一定是非从零开始啊。
	while (i < j)---------------因为i=j的时候就是结束这个小过程的时候。所以在i=j的那一刻停止就可以了
	{
		while (i <= j&&s[j] < x)-----------while(i<j&&s[j]>=x)【两个while中需要有一个=x的】
			j--;
		s[i] = s[j];-----------------------if(i<j)------因为出while的时候可能i=j了,这里保证在不等的时候填坑,并移动                               {s[i]=s[j];                                i++;}
		while (i <= j&&s[i] > x)-----------同理,s[i]<x;
			i++;
		s[j] = s[i];

	}

	s[i] = x;
	return x;--------------------------返回的是坑,而不是坑里的东西  return i

}

void quick_sort(int s[], int left,int right)
{
	if (s == NULL||left>=right)------这里关于空的检查。。。很奇怪----这是个问题待解决
		return;
	int g = partition(s, left, right);
	quick_sort(s, left, g - 1);--------------------递归
	quick_sort(s, left + 1, right);
}

  整合成一个函数的时候

注意:

①将返回值设为void

②在最开始检查left和right的大小----如果不检查会造成堆栈溢出----原因是最后递归是要g-1和g+1的,如果不检查会超出范围。

时间: 2024-10-11 17:20:31

DSA-interview-快速排序笔记的相关文章

[数据结构和算法]快速排序笔记

特点:1.是冒泡的改进2.是一个递归的过程3.不稳定 4.时间复杂度:O(nlogn) 设要排序的数组是A[0]...A[n-1],首先取数组的第一个数作为关键数据,然后将所有比它小的数都放到它的前面,比他大的都放到他的后面,这个过程被称为一趟快速排序 算法步骤:1.设置两个变量i,j,排序开始i = 0, j = N-1;2.以第一个数组元素作为关键字,Key = A[0];3.从J开始向前搜索,即由后开始向前搜索j--, 找到第一个小于key的值A[j],将A[j]赋值给A[i]4.从I开始

算法笔记之快速排序

1.1 算法思路-- 该算法在数组中选定一个元素作为主元(一般选第一个),然后以这个主元为参考对象将数组分为两个部分,第一部分都是小于或者等于主元,第二部分都是大于或者等于主元.然后对第一和第二部分递归地使用快速排序算法,直到分到最小的小组为止. 1.2 时间复杂度-- 在最差的情况下,要把n个元素的数组划分,需要n次比较和n次移动.假设用T(n) 来表示使用快速排序算法来排序n个元素的数组所耗费的时间.那么 T(n) = T(n/2)+ T(n/2) +2n 所以,快速排序的时间复杂度应该是

DSA签名算法笔记

注意:只是个人理解,可能有不正确的地方 DSA(Digital Signature Algorithm)签名算法是由美国国家标准与技术研究院(NIST, National Institute of Standards and Technology)提出的一个关于数字签名的美国联邦信息处理标准(FIPS, Federal Information Processing Standard).该标准在1991年8月提出,1993以FIPS 186被采用,作为数字签名(DSS, Digital Signa

算法第四版学习笔记之快速排序 QuickSort

软件:DrJava 参考书:算法(第四版) 章节:2.3快速排序(以下截图是算法配套视频所讲内容截图) 1:快速排序 2:

数据结构学习笔记06排序 (快速排序、表排序)

1.快速排序 不稳定 分而治之 找主元pivot,小于主元划分为一个子集,大于主元的划分为一个子集 然后进行递归 最好情况:每次主元正好中分,T(N) = O( NlogN ) 选主元 的方法有很多,这里用 取头.中.尾的中位数. 直接选A[0]为pivot,时间复杂度T ( N ) = O( N ) + T ( N–1 ) = O( N ) + O ( N–1 ) + T( N–2 ) = = O( N ) + O ( N–1 ) + …+ O( 1 ) = O( N^2 ) 随机取pivot

算法笔记_015:快速排序(Java)

目录 1 问题描述 2 解决方案 2.1 快速排序原理简介 2.2 具体编码 1 问题描述 给定一组数据,使用快速排序得到这组数据的非降序排列. 2 解决方案 2.1 快速排序原理简介 引用自百度百科: 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行

【算法导论】学习笔记——第7章 快速排序

对于包含n个数的输入数组来说,快速排序是一种最坏情况时间复杂度为theta(n^2)的排序算法.虽然最坏情况时间复杂度很差,但是快速排序通常是实际排序应用中最好的选择,因为它的平均性能非常好,期望时间复杂度是theta(nlgn),而且常数因子非常小,并可进行原址排序.1. 快速排序的描述快速排序可采用分治思想实现.分解:数组A[p..r]被划分为两个(可能为空)子数组A[p..q-1]和A[q+1..r],使得A[p..q-1]中的每一个元素都小于等于A[q],而A[q]也小于等于A[q+1.

冒泡排序,插入排序,归并排序,快速排序的学习笔记

这几个很基础的排序非常有用,我重新整理了下代码 1 #include<iostream> 2 #include<algorithm> 3 4 using namespace std; 5 6 void Bouble_Sort(int * Arry,int Lenth) //冒泡排序 7 { 8 int i,k; 9 10 int flag = 0; 11 12 for(i = Lenth - 1;i >= 0; i--) 13 { 14 for(k=0;k<i;k++)

经典排序算法学习笔记之二——快速排序

一.快速排序 数据结构 不定 最差时间复杂度 O(n^2) 最优时间复杂度 O (n*log n) 平均时间复杂度 O (n*log n) 最差空间复杂度 根据实现的方式不同而不同 https://zh.wikipedia.org/wiki/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F 1.算法思想: 从数列中挑出一个元素,称为"基准"(pivot), 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边

DSA——链表笔记【删除(3个),添加(2个),查找】【循环链表-画个图就明确了】

几个容易忽视的点儿,这里记一下 删除结点中,删除特定元素值结点及删除尾结点 都需要通过循环找到!注意!没有循环体,找到即可!! 一.删掉info=el的结点[注意链表为空!和只有一个结点!!]   public void delete(int el) { LinkedNode prev=null,temp=null; if(isEmpty()) return;//第一步就是判断是不是空链表 if(head==tail&&head.info==el)//如果只有一个结点,且 结点元素等于el