排序算法之快速排序(Java)

//快速排序
public class Quick_Sort {

	// 排序的主要算法
	private int Partition(int[] data, int start, int end)
	{
		int mid_data = data[end];// 选取最后最个数作为中间值哨兵,从开始进行遍历,每个数与之比较
		int index = start; // 记录比哨兵小的数字在左端的位置或个数
							// 注意要考虑start = 0的情况,和《算法导论》中的伪码有区别
		for (int i = start; i < end - 1; i++)
		{
			// 判断每个值与哨兵的大小关系,小于等于则放在左边index位置处,并将index++
			// 可以理解为通过index计算小于哨兵的值的个数,并将所有小于或等于的数通过交换移过来
			if (data[i] <= mid_data)
			{
				swap(data, i, index);
				index++;
			}
		}
		// 将哨兵移动至中间处,由于data[index]肯定大于mid_data,故移至最后依然满足算法的要求
		swap(data, index, end);
		return index;
	}

	// 分治法
	public void QuickSort(int[] data, int start, int end)
	{
		if (start < end)
		{
			// 原址排序,找到中间值将数组一分为二,分治法继续递归
			int mid = Partition(data, start, end);
			QuickSort(data, start, mid - 1);
			QuickSort(data, mid + 1, end);
		}
	}

	// 无法像C++一样使用引用实现,故只好使用data数组进行改变
	private void swap(int[] data, int a, int b)
	{
		int temp = data[a];
		data[a] = data[b];
		data[b] = temp;
	}

	public void print_array(int[] data)
	{
		for (int num : data)
		{
			System.out.print(num);
			System.out.print(" ");
		}
	}

	public static void main(String[] args)
	{

		int data[] = { 2, 34, 45, 2, 13, 24, 5, 24, 57 };
		Quick_Sort quick_Sort = new Quick_Sort();

		quick_Sort.QuickSort(data , 0 , data.length - 1);//注意初始调用的参数值
		quick_Sort.print_array(data);

	}

}

时间: 2024-07-31 13:22:23

排序算法之快速排序(Java)的相关文章

排序算法之快速排序Java实现

排序算法之快速排序 舞蹈演示排序: 冒泡排序: http://t.cn/hrf58M 希尔排序:http://t.cn/hrosvb  选择排序:http://t.cn/hros6e  插入排序:http://t.cn/hros0W  快速排序:http://t.cn/ScTA1d  归并排序:http://t.cn/Sc1cGZ 快速排序是一个就地排序,分而治之,大规模递归的算法.从本质上来说,它是归并排序的就地版本. 1.快速排序可以由下面四步组成:(1) 如果不多于1个数据,直接返回.(2

排序算法之快速排序(java实现)

package com.javaTest300; public class Test039 { public static void main(String[] args) {// 快速排序 int a[]={2,3,8,10,5,1,8,78,35,12}; System.out.println("----排序前-----"); for (int i = 0; i < a.length; i++) { System.out.print(a[i]+" ");

排序算法之快速排序 JAVA快速排序算法

public static void quickSort(int[] arr, int low , int height){ int l=low, h = height; if(low < height){ int temp = arr[low]; while(low < height){ while(low < height && temp < arr[height]){ height --; } arr[low] = arr[height]; while(low

排序算法 之 快速排序

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

常用排序算法之——快速排序(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

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

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

经典排序算法之快速排序(C语言版)

快速排序是一种很常用的排序算法. /*  * 快速排序(伪算法) 2016-04-20 23:34:16  * 1.先找到第一个元素的最终位置  * 2.对第一个元素的最终位置之前的元素,进行快速排序.  * 3.对第一个元素的最终位置之后的元素,进行快速排序.  * */ extern void QuickSort(int a[],int low,int high);//第二个参数表示第一个元素的下标,第三个参数表示最后一个元素的下标 extern int FindPos(int a[], i

排序算法之快速排序的随机化版本

4.3 快速排序的随机化版本 这种方法并不是一种全新的排序算法,而是在快速排序的基础上加入随机化的因素,因素,因而仍然将其作为第四种方法(快速排序)的一种补充. 为什么要提出快速排序的随机化版本,主要是对于快速排序法其划分情况的好坏会直接影响排序的效率,而且,快速排序的平均性能较好,所以,加入随机化成分,可以使该算法对于所有输入均能获得较好的平均情况性能. 针对加入随机化的环节,选取的是选取主元的环节,因为主元的选取直接影响快速排序算法的数组划分. C代码实现为: #include <stdio

排序算法之快速排序(Quicksort)解析

一.快速排序算法的优点,为什么称之为快排? Quicksort是对归并排序算法的优化,继承了归并排序的优点,同样应用了分治思想. 所谓的分治思想就是对一个问题“分而治之”,用分治思想来解决问题需要两个步骤: 1.如何“分”?(如何缩小问题的规模) 2.如何“治”?(如何解决子问题) 快排的前身是归并,而正是因为归并存在不可忽视的缺点,才产生了快排.归并的最大问题是需要额外的存储空间,并且由于合并过程不确定,致使每个元素在序列中的最终位置上不可预知的.针对这一点,快速排序提出了新的思路:把更多的时