数据结构(4)快速排序

快速排序

  • 快速排序原理

快速排序(Quick Sort)的基本思想是,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可对这两部分记录继续进行排序,以达到整个序列有序的目的。

  • 主程序
package Sort;

public class QuickSort {

	private void Qsort(int[] list, int low, int high){
		int privot;
		if(low < high) {
			print(list);
			/*算出枢轴值privot*/
			privot = Partition(list, low, high);
			/*对低子表递归排序*/
			Qsort(list, low, privot-1);
			/*对高子表递归排序*/
			Qsort(list, privot+1, high);
		}
	}

	private int Partition(int[] list, int low, int high){
		/*用表的第一个记录做枢轴记录*/
		int privotkey = list[low];
		while (low < high){
			while (low < high && list[high] > privotkey)
				high--;
			/*将比枢轴记录小的记录交换到低端*/
			swap(list, low, high);
			while (low < high && list[low] < privotkey)
				low++;
			/*将比枢轴记录大的记录交换到高端*/
			swap(list, low, high);
		}
		/*返回枢轴所在的位置*/
		return low;
	}

	private void swap(int [] list,int j, int i){
		int temp;
		temp = list[i];
		list[i] = list[j];
		list[j] = temp;
	}	

	private void print(int[] data) {
		System.out.println("当前list数组的值:");
		for (int i = 0; i < data.length; i++) {
			System.out.print(data[i] + "\t");
		}
		System.out.println();
	}

	public static void main(String[] args) {
		int[] list = {50,40,80,30,60,70,10,90,20};
		QuickSort qs = new QuickSort();
		qs.Qsort(list, 0, list.length-1);
		qs.print(list);
	}
}

  

  • Qsort()分析
	private void Qsort(int[] list, int low, int high){
		int privot;
		if(low < high) {
			print(list);
			/*算出枢轴值privot*/
			privot = Partition(list, low, high);
			/*对低子表递归排序*/
			Qsort(list, low, privot-1);
			/*对高子表递归排序*/
			Qsort(list, privot+1, high);
		}
	}

  

  • Partition()分析
	private int Partition(int[] list, int low, int high){
		/*用表的第一个记录做枢轴记录*/
		int privotkey = list[low];
		while (low < high){
			while (low < high && list[high] > privotkey)
				high--;
			/*将比枢轴记录小的记录交换到低端*/
			swap(list, low, high);
			while (low < high && list[low] < privotkey)
				low++;
			/*将比枢轴记录大的记录交换到高端*/
			swap(list, low, high);
		}
		/*返回枢轴所在的位置*/
		return low;
	}

  

  • 输出结果
当前list数组的值:
50	40	80	30	60	70	10	90	20
当前list数组的值:
20	40	10	30	50	70	60	90	80
当前list数组的值:
10	20	40	30	50	70	60	90	80
当前list数组的值:
10	20	30	40	50	70	60	90	80
当前list数组的值:
10	20	30	40	50	60	70	90	80
当前list数组的值:
10	20	30	40	50	60	70	80	90

  

  • 时间复杂度分析

  最优情况下,快速排序算法的时间复杂度为O(nlogn),空间复杂度也为O(nlogn)

时间: 2024-10-25 19:09:33

数据结构(4)快速排序的相关文章

浅谈算法和数据结构: 四 快速排序

原文:浅谈算法和数据结构: 四 快速排序 上篇文章介绍了时间复杂度为O(nlgn)的合并排序,本篇文章介绍时间复杂度同样为O(nlgn)但是排序速度比合并排序更快的快速排序(Quick Sort). 快速排序是20世纪科技领域的十大算法之一 ,他由C. A. R. Hoare于1960年提出的一种划分交换排序. 快速排序也是一种采用分治法解决问题的一个典型应用.在很多编程语言中,对数组,列表进行的非稳定排序在内部实现中都使用的是快速排序.而且快速排序在面试中经常会遇到. 本文首先介绍快速排序的思

数据结构之快速排序

快速排序是冒泡排序的改进版,也是最好的一种内排序,在很多面试题中都会出现,也是作为程序员必须掌握的一种排序方法. 思想:1.在待排序的元素任取一个元素作为基准(通常选第一个元素,但最的选择方法是从待排序元素中随机选取一个作为基准),称为基准元素: 2.将待排序的元素进行分区,比基准元素大的元素放在它的右边,比其小的放在它的左边: 3.对左右两个分区重复以上步骤直到所有元素都是有序的. 所以我是把快速排序联想成东拆西补或西拆东补,一边拆一边补,直到所有元素达到有序状态. 下面再看看示图理解下吧:

c语言数据结构之 快速排序

编译器:VS2013 #include "stdafx.h"#include<stdlib.h> //函数声明 void QuickSort(int a[],int n); //快速排序(从小到大)void QSort(int a[], int m, int n); //快速排序的递归调用int Pratition(int a[], int m, int n); //快速单次排序 int main(){ int i,n,a[100]; printf("请输入需要排

golang数据结构之快速排序

具体过程:黑色标记代表左指针,红色标记代表右指针,蓝色标记代表中间值.(依次从左往向下) //QuickSort 快速排序 func QuickSort(left int, right int, arr *[7]int) { l := left r := right pivot := arr[(left+right)/2] tmp := 0 for l < r { for arr[l] < pivot { l++ } for arr[r] > pivot { r-- } if l >

数据结构_快速排序

//快速排序 class ArrayList { constructor () { this.array = [] } insert (data) { return this.array.push(data) } quickSort () { this.array = this.quick(this.array) } //辅助函数 quick (arr) { let length = arr.length if (length <= 1) return arr let pivotValue =

数据结构基础温故-7.排序

排序(Sorting)是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为按关键字“有序”的记录序列.如何进行排序,特别是高效率地进行排序时计算机工作者学习和研究的重要课题之一.排序有内部排序和外部排序之分,若整个排序过程不需要访问外存便能完成,则称此类排序为内部排序,反之则为外部排序.本篇主要介绍插入排序.交换排序.选择排序和归并排序这几种内部排序方法. 首先,我们今天的目标就是编写一个SortingHelper类,它是一个提供了多种排序方法的帮助类,后面我们的目标就是实现其中

浅谈算法和数据结构系列汇总(转)

突然看到一个大神的系列文章讲的就是算法和数据结构,现在把它的文章集中分享给大家,向大神致敬: 浅谈算法和数据结构: 一 栈和队列 浅谈算法和数据结构: 二 基本排序算法 浅谈算法和数据结构: 三 合并排序 浅谈算法和数据结构: 四 快速排序 浅谈算法和数据结构: 五 优先级队列与堆排序 浅谈算法和数据结构: 六 符号表及其基本实现 浅谈算法和数据结构: 七 二叉查找树 浅谈算法和数据结构: 八 平衡查找树之2-3树 浅谈算法和数据结构: 九 平衡查找树之红黑树 浅谈算法和数据结构: 十 平衡查找

算法经典文章收藏

作者 标题 archimedes MapReduce实战--倒排索引 - codingwu - 博客园 archimedes MapReduce原理与设计思想 - codingwu - 博客园 archimedes 算法--递推策略 - codingwu - 博客园 archimedes 动态规划算法 - codingwu - 博客园 archimedes 字符串匹配--暴力搜索算法 - codingwu - 博客园 archimedes 算法--枚举策略 - codingwu - 博客园 ar

数据结构例程—— 交换排序之快速排序

本文是[数据结构基础系列(9):排序]中第5课时[交换排序之快速排序]的例程. 1.以第1个元素作为基准 #include <stdio.h> #define MaxSize 20 typedef int KeyType; //定义关键字类型 typedef char InfoType[10]; typedef struct //记录类型 { KeyType key; //关键字项 InfoType data; //其他数据项,类型为InfoType } RecType; //排序的记录类型定

18. 蛤蟆的数据结构进阶十八排序实现之快速排序

18. 蛤蟆的数据结构进阶十八排序实现之快速排序 本篇名言:"一个人做点好事并不难,难的是一辈子做好事,不做坏事.--毛泽东" 我们最后来看下快速排序,以及各个排序之间的一些信息汇总. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47817933 1.  快速排序 快速排序由C. A. R.Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分