自己整理的算法 (4)快速排序

package sort;

public class QuickSort {
	public static void quickSort(int[] list){
		quickSort(list,0,list.length-1);
		}
	//注意这里是private
	private static void quickSort(int[] list,int first ,int last){
		//这里有一个if条件 别忘了
		if(last>first){
		int pivotIndex = partition(list, first, last);
		quickSort(list,first,pivotIndex-1);//这里是first和pivotIndex-1
		quickSort(list,pivotIndex+1,last);//这里是pivoeIndex+1
		}
		}
	//注意这里是的返回值是int
	private static int partition(int[] list,int first,int last){
		int pivot = list[first];
		int low = first+1;
		int high = last;

	while(low<high){
		while(low<= high&& list[low]<=pivot)
			low++;
		while(low<=high&&list[high]>pivot)
			high--;
		if(high>low){  //这里面要注意的是比较的是下标而不是数组值 ,因为此时数组值就是hign的比low的小了
			int temp= list[high];  //自己连交换条件都写错了
     		list[high] = list[low];
			list[low]=temp;

		}

	}

	while(high>first&&list[high]>=pivot) //注意这里面是大于等于pivot
		high--;
	if(pivot>list[high])
	{   list[first]=list[high];
		list[high]=pivot;
		return high;
	}
	else return first;

	}

public static void main(String[] args){
		int[] list = {2,3,2,5,6,1,3,14,12};
		quickSort(list);
		for(int i=0;i<list.length;i++)
		System.out.print(list[i]+" ");

}
}

  

时间: 2024-10-27 07:34:59

自己整理的算法 (4)快速排序的相关文章

排序算法 之 快速排序

快速排序是基于分治思想的一种排序算法,就像该方法的名字一样,速度比较快,所以叫做快速排序:它的平均时间复杂度为O(N*logN),最坏时间复杂度为O(n2),由于快速排序在序列元素数量多的时候速度比较快,所以很多语言内置的排序方法也是用快速排序实现的.快速排序也有很多优化的版本,比如在排序时基数的选择等等-下面就说一下一般的快速排序的实现. 基本思想: 快速排序的基本思想就是,先从待排序的序列中任选一个元素作为基数,然后将序列中的其他小于基数的元素放在基数的左边,大于或等于基数的元素放在基数的右

算法:快速排序

原理: 在一个数组中,选一个元素(通常是第一个元素或者数组的中间元素)与剩余的其它元素进行比较:建立两个分组(左组和右组),比当前元素小的放在左组,比当前元素大的放在右组.这样一来,将左组,中间组合右组合并起来就形成一个已经“排好序”的数组.实际上,左组和右组中的元素并不一定已经排好序,调用自己去排序,只有左右数组的元素个数大于1,就需要排序,如果元素个数等于一个,就不再调用函数. 使用递归实现(步骤): 1.实现从数组中取出一个元素:将小的放左边数组,大的放右边数组,最后返回合并结果 2. 

十大基础实用算法之快速排序和堆排序

快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来. 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists). 算法步骤: 1 从数列中挑出一个元素,称为 "基准"(pi

经典白话算法之快速排序

[分析] [伪代码] [运行过程] [代码] /********************************* * 日期:2014-04-01 * 作者:SJF0115 * 题目:快速排序 **********************************/ #include <iostream> #include <stdio.h> using namespace std; //对子数组array[p...r]就地重排 int Partition(int array[],i

啊哈!算法之快速排序与桶排序

啊哈!算法之快速排序与桶排序 1.快速排序算法 快速排序由 C. A. R. Hoare(东尼·霍尔,Charles Antony Richard Hoare)在1960 年提出,之后又有许多人做了进一步的优化.在数列种随机找出一个基准数,因为数列是杂乱的,所以取首项为基准数.从后往前找到比基准数大的位置,再从前往后找到比基准数小的位置,交换元素:右游标向前移动与左游标向后移动,它们相遇时用基准数的位置与相遇的位置交换.此时原来数列以相遇的位置被划分为了两个需要排序的数列,再次执行上述过程:当左

排序算法 一 快速排序

算法:快速排序 思想:通过一趟排序,确定了一个data的最终确切位置.(通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列)  特点:不稳定算法. 代码实现:

算法之快速排序

这里简单的介绍下快速排序的伪代码实现和示意图: QuickSort(A,p,r) if p<r q=Partition(A,p,r) QuickSort(A,p,q-1) QucikSort(A,q+1,r) 算法的关键部位为Partition函数的实现,它实现了对数组A(p,r)的原址排序: Partition(A,p,r) x=A[r] i=p-1 for j=p to r-1 if a[j]<=x i=i+1 exchange a[i] with a[j] exchange A[i+1]

常用排序算法之——快速排序(C语言+VC6.0平台)

经典排序算法中快速排序具有较好的效率,但其实现思路相对较难理解. #include<stdio.h> int partition(int num[],int low,int high) //以key为基准 将待排数列“高”.“低 ”两部分,“高”部分的所有数据比key大,“低”部分的数据都比key小 { int left,right,key; left=low;right=high;key=num[low]; while(left<right) { while(left<right

常用排序算法之——快速排序

快速排序的原理: 首先找一个标兵值,等于某一个元素值:遍历数组,将数组分为小于标兵值和大于标兵值的两部分:然后分别对两个部分采用快速排序,递归. 分开数组时,维持一个指针,指向已找到小部分的最后一个元素:一个指针用于遍历. 不稳定排序算法.当数组已经有序时,时间复杂度最差,为O(N2),平均.最优情况下都为O(N lgN). 代码如下: 1 #include <iostream> 2 using namespace std; 3 4 template<typename T> 5 v

排序算法系列——快速排序

记录学习点滴 快速排序算法是一种很有趣的算法,短小精悍,性能强劲,对于大部分情况都可以胜任,但对极端环境难以应付. 快速排序我理解为:这是一个“以自我为中心的”+“分治法”思想的算法. 分治法不必多说,化繁为简,那就是逐个击破. 那什么是“以自我为中心”?顾名思义,就是每次都一个“我”,每个人都要围绕“我”行事,比“我”小的都去左边站着,比“我”他大的都去右边站着,而且“我”不去关心每一边都有谁,反正你没“我”大或者小就行.一旦“我”落位了妥帖了,“我”就不动了.然后再在左右两边分别产生新“我”