`
ColorPanda
  • 浏览: 63325 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

算法-快速排序(1)

 
阅读更多

快排算法的特点

实用性强。

很多实际的项目中使用了快排算法。但通常对算法都进行了调整(tuning),比如Java.util.Arrays类中的sort函数就使用了快排算法,但使用了双参考值(Dual-Pivot Quicksort)等一些改进措施。由于快排算法为递归算法,可以用循环代替递归函数调用,改进性能。 

可以将数组中的数据直接交换位置实现排序,所以理论上不需要额外的空间。

时间复杂度

平均情况:O(nlgn)

最坏情况:O(n*n),发生在当数据已经是排序状态时

快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists

算法步骤:

从数列中挑出一个元素,称为 “基准”(pivot),

重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。

递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

(图片从网上下载的,图中的基元选择的是最后一个元素,代码实现选第一个元素)

 

public class QuickSort {

	public static void main(String[] args) {
		int arr[] = { 10, 1, 56, 45, 2, 9, 33, 10 };
		quickSort(arr, 0, arr.length - 1);
		for (int a : arr) {
			System.out.println(a);
		}

	}

	private static void quickSort(int[] array, int start, int end) {
		if (start > end) {
			return;
		}
		// 初始化保存基元,i,j
		int key = array[start];
		int i = start, j;
		for (j = start + 1; j <= end; j++) {

			// 如果此处元素小于基元,则把此元素和i+1处元素交换,并将i加1,如大于或等于基元则继续循环
			if (array[j] < key) {
				int temp = array[j];
				array[j] = array[i + 1];
				array[i + 1] = temp;
				i++;
			}

		}
		// 交换i处元素和基元
		array[start] = array[i];
		array[i] = key;
		// 递归调用
		quickSort(array, start, i - 1);
		quickSort(array, i + 1, end);
	}
}

 

 

 

 

 

  • 大小: 90.8 KB
分享到:
评论

相关推荐

    C语言算法-快速排序法

    C语言算法--快速排序法

    详解Java常用排序算法-快速排序

    快速排序算法详解 快速排序(Quick Sort)是一种分治思想的排序算法,它的基本思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,然后再分别对这两部分记录继续...

    算法-数据结构和算法-13-快速排序.rar

    快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治法(Divide and Conquer),通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的...

    经典算法的C#源码实现

    经典排序算法 - 快速排序Quick sort 经典排序算法 - 桶排序Bucket sort 经典排序算法 - 插入排序Insertion sort 经典排序算法 - 基数排序Radix sort 经典排序算法 - 鸽巢排序Pigeonhole sort 经典排序算法 - ...

    《数据结构与算法》-李春葆 实验报告-典型排序算法实践-快速排序

    数据结构与算法 - 快速排序算法实现报告 在数据结构与算法的学习过程中,快速排序算法是一种重要的排序算法,它具有排序速度快、就地排序的优点,但也具有不稳定性。以下是快速排序算法的详细实现报告。 快速排序...

    Python中高效排序算法-快速排序的不同实现

    内容概要:文章详细介绍了快速排序的基本原理以及在Python环境下的三种具体实现方式,包括基于列表推导式的递归实现、原地排序以及面向对象的方法,旨在帮助读者深入理解并灵活应用此高效的排序算法。 适用人群:对...

    算法设计实验报告-快速排序和归并排序

    本实验旨在通过对两种经典排序算法——快速排序和归并排序的研究与实现,深入理解它们的基本原理、时间复杂度,并通过编程实践比较这两种算法在不同数据规模下的性能表现。 #### 二、快速排序 **1. 基本思想** ...

    算法设计-快速排序

    算法设计,快速排序的C++实现代码,并测试运行时间

    算法实验1-快速排序

    在给出的"Lab 1"文件中,可能包含了实现快速排序的代码,包括普通快速排序和随机快速排序的版本,以及统计两种排序算法运行时间的代码。通过分析和运行这些代码,你可以更深入地理解快速排序的工作原理和性能特性。

    《算法设计与分析》实验报告---快速排序.pdf

    快速排序算法设计与分析 快速排序(Quicksort)是一种高效的排序算法,由美国计算机科学家Tony Hoare在1960年发明。该算法的时间复杂度平均为O(n log n),在实际应用中非常常用。 一、快速排序算法的基本思想 ...

    FPGA并行快速排序算法-位宽可设

    在本文中,我们将深入探讨基于FPGA的并行快速排序算法,特别关注“位宽可设”的特性。这种算法能够高效地处理大量数据,并且在硬件实现上具有很高的灵活性。我们将从以下几个方面来阐述这个主题: 一、快速排序算法...

    算法设计与分析-1排序算法性能分析-冒泡/选择/插入/合并/快速排序-pre ppt

    本篇文章将详细讨论几种常见的排序算法:选择排序、冒泡排序、插入排序、合并排序以及快速排序,分析它们的算法原理、时间效率,并通过经验分析验证理论分析的准确性。 **1. 选择排序(Selection Sort)** 选择排序...

    最快的排序算法 谁才是最强的排序算法:快速排序-归并排序-堆排序,排序算法数据结构

    本文将对快速排序、归并排序、堆排序等常见排序算法进行比较和分析,探讨它们的优缺点和适用场景。 首先, let's 看一下这些排序算法的时间复杂度和空间复杂度: | 排序算法 | 平均情况 | 最好情况 | 最坏情况 | ...

    经典算法-- 排序算法介绍

    最坏情况是逆序数组,需要进行n*(n-1)/2次比较和交换,时间复杂度为O(n^2)。 交换排序,也称为选择排序,它的基本思想是从未排序的序列中选取最小(或最大)的元素,放置到已排序序列的末尾,然后再从剩余未排序的...

    最快的排序算法 计算机最快的算法-史上14个最快速算法:孩子的计算能力爆表!大脑堪比计算机!...,排序算法数据结构

    快速排序算法是一种高效的排序算法,它的工作原理是通过选择一个元素作为pivot,然后将数组分为两个部分,以达到排序的目的。快速排序算法的时间复杂度为O(n log n),因此它适合大规模的数据排序。 5.归并排序算法 ...

    算法-贪婪算法与快速排序ppt

    1. 快速排序的定义:一种基于分治策略的排序算法,通过递归方式将待排序序列分成独立的两部分,其中一部分的所有数据都比另一部分的所有数据要小,然后再按此方法对这两部分数据分别进行快速排序。 2. 快速排序的优...

    选择排序-插入排序-快速排序-冒泡排序

    本主题将详细探讨四种常见的排序算法:选择排序、插入排序、快速排序以及冒泡排序,它们都是用C语言实现的。以下是这些排序算法的详细解析: 1. **选择排序(Selection Sort)** - 选择排序是一种简单直观的排序...

    算法-贪婪算法与快速排序代码

    本篇主要围绕两种在编程和问题解决中至关重要的算法——贪婪算法和快速排序算法进行深入讲解,并探讨其在AI优化代码中的应用及其优缺点。 首先,让我们来探讨贪婪算法。贪婪算法是一种在每一步选择中都采取在当前...

Global site tag (gtag.js) - Google Analytics