分治法——快速排序(quicksort)
先上代码
#include <iostream>
using namespace std; int partition(int a[],int low, int high)
{
int pivot = a[low], i = low, j = high;
while(i < j)
{
while(i < j && pivot <= a[j])
j--;
if(i < j) swap(a[i++],a[j]);
while(i < j && pivot >= a[i])
i++;
if(i < j) swap(a[j--],a[i]);
}
return j;
} void quicksort(int a[],int low, int high)
{
int pivotpos;
if(low < high)
{
pivotpos = partition(a,low,high);
quicksort(a,low,pivotpos);
quicksort(a,pivotpos+1,high);
}
} int main()
{
int arr[10] = {1,22,3,4,5,6,77,18,99,10};
quicksort(arr,0,9);
for(int i = 0; i < 10; i++)
cout<<arr[i]<<" ";
cout<<"\n";
return 0;
}
在上篇博客,归并排序里面提到的分治法三步骤。分、治、合并。
快速排序里面主要步骤是第一步,划分。
首先取序列里面的第一个元素作为基准 pivot,然后将序列划分为两部分,一部分大于 pivot,一部分小于 pivot。( pivot = a[low] )
划分的具体办法:定义两根指针 i 和 j,i 从序列的最左边开始往右,j 从序列的最右边往左。当 i < j 的时候进行一下操作:
1基准pivot的位置和 i 的位置是相同的。这种情况下,就应该对 j 进行操作。 当 arr[j] >= pivot 的时候,直接 j - -。直到不符合这个条件的时候就交换基准和 a[j] 的的值,这个时候基准也就是 a[j]。
2基准的位置和 j 的位置是相同的。这种情况下,就应该对 i 进行操作。 当 arr[i] <= pivot 的时候,直接 i ++。直到不符合这个条件的时候就交换基准和 a[i] 的的值,这个时候基准的位置又是 i 的位置。
就可以重复1步骤。然后继续运行循环执行 1、2 操作。
当 i 和 j 相等的时候,返回 i 或者 j 的值。就是划分的区间位置。
按照这种方法不断地划分序列,到最后序列只有一个元素的时候,合并序列,合并后的序列就是有序的。
分治法——快速排序(quicksort)的更多相关文章
- C语言实现快速排序法(分治法)
title: 快速排序法(quick sort) tags: 分治法(divide and conquer method) grammar_cjkRuby: true --- 算法原理 分治法的基本思 ...
- 快速排序(quicksort)算法实现
快速排序(quicksort)是分治法的典型例子,它的主要思想是将一个待排序的数组以数组的某一个元素X为轴,使这个轴的左侧元素都比X大,而右侧元素都比X小(从大到小排序).然后以这个X在变换后数组的位 ...
- 排序算法TWO:快速排序QuickSort
import java.util.Random ; /** *快速排序思路:用到了分治法 * 一个数组A[0,n-1] 分解为三个部分,A[0,p - 1] , A[p] , A[p + 1, n-1 ...
- 快速排序(QuickSort)
1.算法思想 快速排序是一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod). (1) 分治法的基本思想 分治法的基本思想是:将原 ...
- python 实现分治法的几个例子
分治法所能解决的问题一般具有以下几个特征: 1) 该问题的规模缩小到一定的程度就可以容易地解决 2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质. 3) 利用该问题分解出的子 ...
- (排序)快速排序QuickSort
主要内容: 1.算法思想 2.快速排序算法 3.划分算法partition 4.快排过程图解 5.完整代码 1.算法思想 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序.它采用了一 ...
- 分治法(一)(zt)
这篇文章将讨论: 1) 分治策略的思想和理论 2) 几个分治策略的例子:合并排序,快速排序,折半查找,二叉遍历树及其相关特性. 说明:这几个例子在前面都写过了,这里又拿出来,从算法设计的策略的角度把它 ...
- 归并排序(MergeSort)和快速排序(QuickSort)的一些总结问题
归并排序(MergeSort)和快速排序(QuickSort)都是用了分治算法思想. 所谓分治算法,顾名思义,就是分而治之,就是将原问题分割成同等结构的子问题,之后将子问题逐一解决后,原问题也就得到了 ...
- 分治法及其python实现例子
在前面的排序算法学习中,归并排序和快速排序就是用的分治法,分治法作为三大算法之一的,有非常多的应用例子. 分治法概念 将一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题-- ...
随机推荐
- com.android.jack.CommandLine: Internal compiler error
Android studio编译的时候出现错误: SEVERE: com.android.jack.CommandLine: Internal compiler error Error:Executi ...
- redis服务器学习一
一:什么是redis服务器 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zs ...
- ubuntu开机启动
/rc.local (ran as root) https://unix.stackexchange.com/questions/210939/what-user-runs-the-commands ...
- python使用微信推送消息
from wxpy import * #该库主要是用来模拟与对接微信操作的 import requests from datetime import datetime import time impo ...
- Codeforces Round #496 (Div. 3)
一如既往地四题...好久没切了 有点犯困了明显脑子感觉不够灵活. 为了熟练度还是用java写的,,,导致观赏性很差...我好不容易拉了个队友一起切结果过掉a就tm挂机了!!! A题竟然卡了,,,用了十 ...
- hibernate04--三种状态之间的转换
public class StudentTest { Session session=null; Transaction transaction=null; //在执行测试方法之前 先执行before ...
- Date类型与字符串之间的转换
Java中Date类型与字符串转化 (一)Date与字符串的转化 Date.String.Timestamp之间的转换! public static void main(String[] ...
- python 第三方扩展库的安装
主要就是采用 easy_install 和pip安装,一定要把这两个东西安装好.http://peak.telecommunity.com/DevCenter/EasyInstall下载ez_setu ...
- Python学习之旅(二十三)
Python基础知识(22):进程和线程(Ⅰ) 1.多进程 (1)fork Python的os模块封装了常见的系统调用,其中就包括fork,可以在Python程序中轻松创建子进程 fork可以在Mac ...
- 用友U8存货分类通过DataTable生成EasyUI Tree JSON
<%@ WebHandler Language="C#" Class="InventoryClass" %> using System; using ...