快速排序
来源:互联网 发布:php网址导航源码 编辑:程序博客网 时间:2024/06/07 05:05
什么是快速排序
快速排序可以说是对冒泡排序的一种改进,通过选择某个基准点经过一次排序,然后把数据通过基准点分为两个部分。一部分小于基准点;一部分大于基准点;
实现过程
设要排序的数据存放在数组A[0]...A[N-1]中,然后从数组总任意选择一个数据作为基准点,将所有比基准点小的数据放到它的前面,比它小的放到它的后面,这样经过一次交换就分成了两个独立的部分。接着在运用分治的思想,对剩下的接着进行快速排序。
分析过程
比如我们有一组数据: 52、45、63、98、21、7
步骤一:选择第一个数据也就是52作为基准点的话,先从最后向前找到第一个小于52的7
7、45、63、98、21、52 63————52
步骤二:接着从前找到第一个比45大的数据52
7、45、52、98、21、63 21————52
7、45、21、98、52、63 98————52
7、45、21、52、98、63
从最后一组数据中我们可以看出,经过一次的快速排序,就把数组根据52划分为了两个部分。接着只要在对前半部分和后半部分分别执行快速即可,用到了分治的思想。
代码实现
有了以上实现的过程,代码上就简单多了
/// <summary> /// 快速排序实现过程 /// </summary> /// <param name="s">要排序的数组</param> /// <param name="low">数组的第一个元素的下标</param> /// <param name="high">数组的最后一个元素的下标</param> /// <returns></returns> static int AdjustArray(int []s,int low,int high) { //把low和high分别赋给i和j int i = low, j = high; //以第一个元素为基准点,并且保存在x中 int x = s[i]; while(i<j) { //通过这个循环,从后向前查找第一个小于基准点的下标 while(i<j && s[j]>=x) { j--; } if(i<j) { //找到第一个小于基准点的后直接调换 s[i] = s[j]; //指针前移动 i++; } //与上面类似,从前向后找大于基准点的小标 while(i<j&& s[i]<x) { i++; } if(i<j) { //找到后发生调换 s[j] = s[i]; j--; } } //退出时,直接把基准点保存到目前的I中 s[i] = x; return i; } //分治,通过快速排完后,再对前半部分,后半部分分别进行快速排序 static void quick_sort1(int []s,int l,int r) { if(l<r) { int i=AdjustArray(s,l,r); quick_sort1(s,l,i-1); quick_sort1(s, i + 1, r); } }
学习心得
小编在学习中也是经过了一段时间琢磨完成的,劝各位想学的,就在纸上画画、电脑上敲一敲,你一定会开窍的。
0 0
- 快速排序
- 快速排序
- 快速排序
- 快速排序!
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- <读书笔记>新手菜鸟1号—《数据挖掘基础教程》-1
- (四)(1)揭开ZigBee 2006协议栈Z-Stack的”开源“面纱及其他彻底开源的zigbee协议
- 修改teamviewer id
- [Hadoop]Google 的Protocol Buffers 入门
- Android实现基于TCP和UDP协议的即时通讯,含android端和服务器端
- 快速排序
- MyBatis动态SQL语句
- UVA - 10718 Bit Mask 贪心
- hdu 1016 Prime Ring Problem
- php---核心技术
- MySql学习之路1 背景介绍
- 咖啡泡好了吗?---装饰和桥接
- connect layout QColorDialog::getColor QFontDialog::getFont
- 2014.11.5聪明的质检员