`
huntfor
  • 浏览: 201113 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

 
阅读更多

题外话:

一般情况下,快速排序被认为是最快的排序算法(人如其名啊),因此可以说是最常用的排序算法,并受大多数公司的青睐,是一定要熟练掌握的。

 

简介:

快速排序是不稳定的,而且是中比较个性的排序

 算法——初始顺序越乱,排序效果越好,一般情况下,我们认为其时间复杂度为O(NlogN)当排序队列已经是顺序队列,时间复杂度达到最差O(n*n),具体是实现是用分治算法,因此涉及到栈,再因此,其空间复杂度略大,达到同样的O(NlogN),在这个效率为先的环境下,以牺牲些许空间换取更短的时间还是非常值得的。

 

算法思想:

快排采取了分治策略,也是分治算法的一个经典习题,因此其算法思想也符合分治算法,具体的思想是:

1.从数列中找到一个数

2.确定该数在队列中的位置,比它小的都放在左边,大的都在右边

3.将左右两部分分而治之。

 

伪代码如下:

void quickSort(int[] a, int begin, int end) {

	/*
	* 找到所选数字的位置,并记录下来该位置index
	*/
	
	quickSort(a, begin, i - 1);//对左边子问题进行排序
	quickSort(a, i + 1, end);//对右边子问题进行排序
	}

 

下一步,好了,算法框架已经搭好,剩下的问题就是,怎么找到所选数字的位置。

结合实例来详细介绍一下:

     ↓(i)                                                                                                                                                  ↓(j)

0 1 2 3 4 5 6 7 8 9 10 11
5 7 8 2 6 125 41 341 34 63 28 97

首先我们需要找到97在数列中的位置:

首先设左右两个指针,i 向左走,j 向右走,a[ i ] 遇到比97大的,就换到a[ j ]的位置,j-- (换 j 向左走)

                                                                        ↓i(换到 j 处)                                              ↓ j   ←    ↓ j

0 1 2 3 4 5 6 7 8 9 10 11
5 7 8 2 6 125 41 341 34 63 28 97

 

得:                                                                    ↓ i                                                                ↓ j

0 1 2 3 4 5 6 7 8 9 10 11
5 7 8 2 6   41 341 34 63 28 125

同理,a[j] 遇到比97小的,就换到a[ i ]的位置,i++

                                                                          ↓ i   →  ↓ i                                                       ↓ j

0 1 2 3 4 5 6 7 8 9 10 11
5 7 8 2 6  28 41 341 34 63   125

 

i、j分别向左走向右走,迟早会遇到。

当两个指针相遇,即i == j时,这样就能完成了比97小的,都被换到了左边,大的都被换到了右边。想不通的面壁去。因此 相遇的位置即97的位置。

 

PS:我们看到每当做一次交换,则换另一个指针走

 

这样每趟只需要做n次对比、操作,分治之后的树的高度是logN,因此时间复杂度为O(NlogN)

 好了,下面用代码实现:

	int i = begin;//记录两个指针的初始位置
	int j = end;
	int tem = a[end];//选择基数,可以随便选,一般选择端点,简单,安全
	boolean tag = true;//标记该哪个指针走,true表示 i 指针走
	while (i != j) {//如果两个指针没相遇,则一直循环下去
		if (tag) {//左边指针走
			if (a[i] < tem) {//如果不满足交换条件,就继续走
				i++;
				continue;
			} else {//满足交换条件,将大数换到右边
				a[j] = a[i];
				j--;//该句可以略去,若略去,a[j]要多对比一次
				tag = !tag;//换右指针向左走
			}
		} else {
			if (a[j] > tem) {//同上
				j--;
				continue;
			} else {
				a[i] = a[j];
				i++;//可略去
				tag = !tag;
			}
		}
	}
	a[i] = tem;//最右当i 、j相遇时,把当时所选的数放进去即可

  

上述代码相对比较傻瓜,是完全按照上面一步一步来的,代码可以进一步压缩:

 

while(i < j){

   while(i < j && a[j] > tem){ j--;}
   swap(a[i],a[j]);//交换两个数
   while(i < j && a[j] < tem){i++;}
   swap(a[i],a[j]);
}
a[i] = tem;

 当然,分治法用到了递归,是肯定要设置一个出口的,

if(end <= begin){
   return;
}

 以上即可。

 

 

附录:

下面把完整外码贴出来

 

public class QuickSort {

	static void quickSort(int[] a, int begin, int end) {

		/*
		 * 找到某个数字的制定位置,并记录下来
		 */
		if(end <= begin){
			return;
		}
		int i = begin;
		int j = end;
		int tem = a[end];
		boolean tag = true;
		while (i != j) {
			if (tag) {
				if (a[i] < tem) {
					i++;
					continue;
				} else {
					a[j] = a[i];
					tag = !tag;
				}
			} else {
				if (a[j] > tem) {
					j--;
					continue;
				} else {
					a[i] = a[j];
					tag = !tag;
				}
			}
		}
		a[i] = tem;
		quickSort(a, begin, i - 1);
		quickSort(a, i + 1, end);
	}

	public static void main(String[] args) {
		int[] a = { 5, 7, 8, 2, 6, 125, 41, 341, 34, 63, 28, 97 };
		quickSort(a, 0, a.length - 1);
	}

}

 

分享到:
评论

相关推荐

    算法课程设计——分治法(java实现)

    在本课程设计中,我们将使用 Java 语言对快速排序算法进行实现,并对算法的性能进行分析和比较。 快速排序算法的优点包括: * 高效的排序速度:快速排序算法的时间复杂度为 O(n log n),它是一种高效的排序算法,...

    最快的排序算法 图解八大排序算法——我见过的最详细的讲解(转),排序算法数据结构

    常见的排序算法有八种,即选择排序、冒泡排序、插入排序、归并排序、快速排序、堆排序、.radix 排序和基数排序。 一、分类 内部排序和外部排序是两种基本的排序分类。内部排序是指待排序记录存放在计算机随机...

    算法可视化系列——排序算法——快速排序

    **AlgorithmQuickSort.java** 文件很可能是实现快速排序算法的Java代码。在Java中,快速排序通常通过递归函数实现。以下是一个简单的快速排序的Java实现示例: ```java public class QuickSort { public void ...

    算法可视化系列——排序算法——冒泡排序

    在`AlgorithmBubleSort.java`文件中,我们可以期待看到一个用Java实现的冒泡排序算法。以下是一个详细的冒泡排序算法实现和相关的知识点: 1. **基本概念**: - **排序算法**:对一组数据按照特定的顺序进行排列的...

    各种排序算法java实现

    标题 "各种排序算法java实现" 涉及到的是计算机科学中的一个重要领域——算法,特别是排序算法在Java编程语言中的具体应用。排序算法是数据结构与算法分析中的基础部分,它们用于将一组数据按照特定顺序排列。在这个...

    快速排序算法以及归并算法

    根据给定的文件信息,我们将深入探讨两种经典的排序算法——快速排序和归并排序,并结合Java语言实现进行详细解析。 ### 快速排序算法 快速排序是一种高效的排序算法,采用分而治之的策略,其核心思想是选择一个...

    排序算法-基于Java实现的排序算法之BubbleSort实现.zip

    总的来说,"排序算法_基于Java实现的排序算法之BubbleSort实现"这个项目提供了学习和实践冒泡排序算法的机会。通过分析和编写这样的代码,不仅可以加深对排序算法的理解,也能提升Java编程技巧。同时,它也提醒我们...

    算法可视化系列——排序算法——选择排序

    **选择排序**是一种简单直观的排序算法,它的工作原理如下:...在实际应用中,更高效的排序算法如快速排序、归并排序或堆排序等通常会优先考虑。然而,对于教学和理解排序算法的基本原理,选择排序是一个很好的起点。

    java实现的4种排序算法(冒泡、快速、插入、选择)

    以下是根据标题和描述中提到的四种排序算法——冒泡排序、快速排序、插入排序和选择排序的详细说明。 **冒泡排序(BuddleSort)**: 冒泡排序是一种简单的交换排序,它通过重复遍历待排序的列表,比较相邻元素并...

    数据结构与问题求解——java语言描述 源码

    例如,`Sort.java`可能包含了各种排序算法的实现,如冒泡排序、插入排序、选择排序、快速排序、归并排序和堆排序等。每种排序算法都有其特定的时间复杂性和适用场景,通过阅读源码可以加深对它们的理解。 此外,...

    快速排序与归并排序的算法比较实验报告

    这篇实验报告将深入探讨两种经典的排序算法——快速排序和归并排序,通过对它们在Java环境中的实现和性能测试,揭示它们在处理不同规模数据时的效率差异。 **快速排序(Quick Sort)** 快速排序由C.A.R. Hoare在...

    java算法——快速排序

    快速排序 * 1.i=left,j=right,将基准数挖出形成第一个坑a[i]; * 2.j--由后向前找比它小的数,找到后挖出此数填前一个坑a[i]; * 3.i++由前向后找比它大的数,找到后挖出此数填到前一个坑a[j]中 * 4.以i为中线,...

    算法可视化系列——排序算法——希尔排序

    希尔排序(Shell Sort)是一种基于插入排序的快速排序方法,由Donald Shell于1959年提出。它的主要思想是将待排序的数据按照一定的间隔进行分组,然后对每组进行插入排序,随着间隔逐渐缩小,最后进行一次全排列,...

    《Java数据结构和算法》学习笔记(2)——4种简单排序算法

    这些算法虽然在复杂度上不如高级排序算法如快速排序或归并排序,但它们提供了基础的排序逻辑,有助于理解更复杂的算法思想。 首先,我们来详细讲解插入排序(Insertion Sort)。插入排序的工作原理类似于我们手动...

    算法-归并排序(java)(csdn)————程序.pdf

    归并排序算法-java 实现 在计算机科学中,排序算法是指将一组无序的数据按照某种规则排列成有序的数据。归并排序(Merge Sort)是一种常用的排序算法,属于分治算法的范畴。下面将详细介绍归并排序算法的java实现。...

    数据结构与算法分析——Java语言描述

    常见的排序算法(如冒泡排序、快速排序、归并排序、堆排序)和查找算法(如线性查找、二分查找)都有详尽的解释和实例。此外,还包括动态规划、贪心算法、回溯法等高级算法思想。算法分析不仅关注实现,更强调时间...

    java版本排序算法

    ### Java版本排序算法详解 #### 插入排序 插入排序是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。在Java中,我们可以创建一个`...

    数据结构与算法答案——java语言描述

    本资料集是“数据结构与算法答案——java语言描述”,虽然全为英文内容,但其深入探讨了使用Java实现数据结构和算法的细节。 1. **数组**:数组是最基本的数据结构之一,它是一系列相同类型元素的集合,可以通过索...

    数据结构与算法分析——Java语言描述-带书签目录高清扫描版

    排序算法如冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序,各有优缺点,适用于不同的数据特性。查找算法包括顺序查找、二分查找和哈希查找,其中哈希表提供了近乎常数时间的查找效率。此外,高级算法如...

Global site tag (gtag.js) - Google Analytics