算法研究之快速排序java版

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

/**
 * @author iamzken
 * 排序算法
 * 使用快速排序算法对一个数组从小到大排序
 * 2015-8-27 13:40
 */
public class Sorter {
	//获取中间索引,该索引对应的关键字把数组分为左右两部分,其中,左边的都比该索引对应的关键字小,右边的都比该索引对应的关键字大
	public static int getMiddle(int[] a , int left , int right){
		//随机取一个关键字,这里取left索引对应的关键字,相当于left索引对应的位置被挖了一个”坑“,需要下面的程序填补这个”坑“
		int key = a[left];
		//临界条件
		while(left < right){
			//当right > left && a[right] > key说明当前right索引所对应的关键字比key大,不需要交换
			while(right > left && a[right] > key){
				right--;
			}
			//程序能执行到这里说明当前right索引所对应的关键字比key小,需要交换,即补”坑“
			a[left] = a[right];
			//当left < right && a[left] < key说明当前left索引所对应的关键字比key小,不需要交换
			while(left < right && a[left] < key){
				left++;
			}
			//程序能执行到这里说明当前left索引所对应的关键字比key大,需要交换,即补”坑“
			a[right] = a[left];
		}
		//程序跳出了while循环,说明left已经等于right,下面两句也可以改为a[right]=key;return right;
		a[left] = key;
		return left;
	}

	public static void quickSort(int[] a , int left , int right){
		//临界条件
		if(left < right){
			//获取中间索引
			int middle = getMiddle(a, left, right);
			//对左边子数组递归排序
			quickSort(a,left,middle-1);
			//对右边子数组递归排序
			quickSort(a, middle+1, right);
		}

	}
	//测试程序
	public static void main(String[] args) {

		int[] a = new int[]{9,3,7,8,2,0,6};
		System.out.println("快速排序前的数组:");
		int i = 0;
		while(i < a.length){
			System.out.print(a[i]+"\t");
			i++;
		}
		System.out.println();
		Sorter.quickSort(a, 0, a.length-1);
		System.out.println("快速排序后的数组:");
		i = 0;
		while(i < a.length){
			System.out.print(a[i]+"\t");
			i++;
		}

	}
}

执行结果:

快速排序前的数组:

9 3 7
8 2
0 6

快速排序后的数组:

0 2 3
6 7
8 9

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-24 22:14:07

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

微博URL短网址生成算法原理及(java版、php版实现实例)

短网址(Short URL),顾名思义就是在形式上比较短的网址.通常用的是asp或者php转向,在Web 2.0的今天,不得不说,这是一个潮流.目前已经有许多类似服务,借助短网址您可以用简短的网址替代原来冗长的网址,让使用者可以更容易的分享链接. 例如:http://t.cn/SzjPjA 短网址服务,可能很多朋友都已经不再陌生,现在大部分微博.手机邮件提醒等地方已经有很多应用模式了,并占据了一定的市场.估计很多朋友现在也正在使用. 看过新浪的短连接服务,发现后面主要有6个字符串组成,于是第一个

【算法】快速排序-Java版

说在前面的话 平常码砖的时候,对于一个数组进行排序更多的是起泡排序,起泡排序对于一般不是很长的数组进行操作没什么问题,一旦数组过大,很明显效率低. 而快排是对起泡排序的一种改进,效率明显优高. 快排思路 快排的思想是通过每一次排序将待排的数组分成两部分,左边的部分所有值均小于右边部分,然后再对这两部分分别再进行排序以达到整修序列有序. Example: 有如下一个无序的序列 arr[](长度为10),现在要对其进行快排 | 10 | 9 | 22 | 38 | 47 | 7 | 11 | 2 |

算法研究之快速排序

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

常见排序算法代码总结(Java版)

学习自菜鸟教程,自己加以总结希望可以多多重复!!! 冒泡排序 选择排序 插入排序 希尔排序 快速排序 归并排序 堆排序 基数排序 1 //冒泡排序 O(n2) 2 public static void BubbleSort(int[] arr){ 3 int temp; 4 for(int i=0;i<arr.length-1;i++){ 5 for(int j=0;j<arr.length-1-i;j++){ 6 if(arr[j]>arr[j+1]){ 7 temp = arr[j]

快速排序Java版

package Quick; public class quicksort { static class QuickSort { public int data[]; private int partition(int array[], int low, int high) { int key = array[low]; while (low < high) { while (low < high && array[high] >= key) high--; array[

排序算法Java版,以及各自的复杂度,以及由堆排序产生的top K问题

常用的排序算法包括: 冒泡排序:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面, 逐次比较,直至将最大的数移到最后.最将剩下的N-1个数继续比较,将次大数移至倒数第二.依此规律,直至比较结束.时间复杂度:O(n^2) 选择排序:每次在无序队列中"选择"出最大值,放到有序队列的最后,并从无序队列中去除该值(具体实现略有区别).时间复杂度:O(n^2) 直接插入排序:始终定义第一个元素为有序的,将元素逐个插入到有序排列之中,其特点是要不断的 移动数据,空出一个适当的位置,把待插

程序员必须掌握的8大排序算法(Java版)

程序员必须掌握的8大排序算法(Java版) 提交 我的评论 加载中 已评论 程序员必须掌握的8大排序算法(Java版) 2015-07-28 极客学院 极客学院 极客学院 微信号 jikexueyuan00 功能介绍 极客学院官方帐号,最新课程.活动发布.欢迎大家反馈问题哟^_^ 本文由网络资料整理而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空

玩转算法系列--图论精讲 面试升职必备(Java版)

第1章 和bobo老师一起,玩转图论算法欢迎大家来到我的新课程:<玩转图论算法>.在这个课程中,我们将一起完整学习图论领域的经典算法,培养大家的图论建模能力.通过这个课程的学习,你将能够真正地,玩转图论算法:) 第2章 图的基本表示千里之行,驶于足下.解决任何有一个图论算法问题,首先需要用基本的数据结构来表示图.在这一章,我们就将探索图的基本表示问题,学习邻接矩阵和邻接表,进而,也让同学们熟悉这个课程的整体代码风格. 第3章 图的深度优先遍历任何一种数据结构,都需要进行遍历.图也不例外.通过深

回溯算法解八皇后问题(java版)

八皇后问题是学习回溯算法时不得不提的一个问题,用回溯算法解决该问题逻辑比较简单. 下面用java版的回溯算法来解决八皇后问题. 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 思路是按行来规定皇后,第一行放第一个皇后,第二行放第二个,然后通过遍历所有列,来判断下一个皇后能否放在该列.直到所有皇后都放完,或者放哪