高速排序

所谓的高速排序,就是在一些中,找一个数(如果为a)为基准。把这些数分成两部分。一部分小于等于a,还有一部分大于a。

思路:

(1)在这些数中,设置一个指针指向第一个(low),一个指针指向最后一个(high)。设置一个基点(取第一个)为v

(2)从高位置high開始。假设*high > v,则high--,然后看low,假设*low<v,则low++。

(3)交换*low和*high

(4)递归运行上面的

#include <stdio.h>

void swap(int *a,int *b)
{
   int c;
   c  = *a;
   *a = *b;
   *b = c;  

}

void qicksort(int list[],int m,int n)
{
   int low = m,high = n,v = list[m];
   while(low < high)
   {
       while(list[high-1] >= v)
		   high--;
	   while(list[low-1] < v )
		   low++;
	   swap(&list[low],&list[high]);
   }
   qicksort(list,m,low-1);
   qicksort(list,low+1,n);
}
时间: 2024-07-29 15:16:21

高速排序的相关文章

高速排序算法C++实现

//quick sort //STL中也有现成的高速排序算法.内部实现採用了下面技巧 //1)枢轴的选择採取三数取中的方式 //2)后半段採取循环的方式实现 //3)高速排序与插入排序结合 #include<vector> #include<iostream> #include<algorithm> using namespace std; //这一版本号是最简单实现版本号.对于高速排序的优化主要有下面几个方面: //1)枢轴的选择.若枢轴选取不全适.比方,若每次递归时

白话经典算法系列之六 高速排序 高速搞定

高速排序因为排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被採用,再加上高速排序思想----分治法也确实有用,因此非常多软件公司的笔试面试,包含像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也经常出现高速排序的身影. 总的说来,要直接默写出高速排序还是有一定难度的,因为本人就自己的理解对高速排序作了下白话解释,希望对大家理解有帮助,达到高速排序,高速搞定. 高速排序是C.R.A.Hoare于1962年提出的一种划分交换排序.它採用了一种分治的

排序算法之高速排序

这一个博客将高速排序讲的挺好的:http://blog.csdn.net/morewindows/article/details/6684558 一.算法思想描写叙述 1)令i = L,j = R,将基准数挖出形成第一个坑(基准数能够选择第一个位置上的数作为基准数,也能够选择其它位置上的数作为基准数). 2)j--   . 从后往前扫,找到第一个比基准数小的数.并将其"挖出",填到上一个形成的坑中arr[i] 3)i++ . 从前往后扫,找到第一个比基准数大的数.并将其"挖出

希尔排序和高速排序

//希尔排序 在直接插入排序算法中,每次插入一个数,使有序序列仅仅添加1个节点,而且对插入下一个数没有提供不论什么帮助. 假设比較相隔较远距离(称为增量)的数,使得数移动时能跨过多个元素,则进行一次比較就可能消除多个元素交换. D.L.shell于1959年在以他名字命名的排序算法中实现了这一思想.算法先将要排序的一组数按某个增量d分成若干组, 每组中记录的下标相差d.对每组中所有元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序. 当增量减到1时,整个要排序的数被分成一组,排序完

高速排序算法

高速排序算法 作者 July  二零一一年一月四日------------------------------------------ 写之前,先说点题外话.每写一篇文章,我都会遵循下面几点原则:一.保持版面的尽量清晰,力保排版良好.二.力争所写的东西,清晰易懂,图文并茂三.尽最大可能确保所写的东西精准,有实用价值. 由于,我认为,你既然要把你的文章,发布出来,那么你就一定要为你的读者负责.不然,就不要发表出来.一切,为读者服务. ok,闲不多说.接下来,咱们立马进入本文章的主题,排序算法.众所

经典排序之高速排序

高速排序堪称最经典的排序.思想是选一个基准值.一般选第一个.然后全部的值与基准值比較,大的位置不变, 小的位置与第一个大的位置互换,就这样进行第一轮排序.然后对于基准值二边的再进行排序,依次类推,直到为剩一个. 以下是快排的代码: public class QuickSort { public void quickSort(int a[],int start,int end){ //比較这个数组是否仅仅有一个值没有进行高速排序 if(start<end){ //基准值 int keyword=a

《算法导论》 — Chapter 7 高速排序

序 高速排序(QuickSort)也是一种排序算法,对包括n个数组的输入数组.最坏情况执行时间为O(n^2). 尽管这个最坏情况执行时间比較差.可是高速排序一般是用于排序的最佳有用选择.这是由于其平均性能相当好.期望的执行时间为O(nlgn).且O(nlgn)中隐含的常数因子非常小.另外它还能够进行就地排序在虚拟环境中也能非常好的工作. GitHub chapter 7 程序代码下载 原理 高速排序也和合并排序一样,基于分治法,分为分解.解决.合并三个步骤. 分解:数组array[low-hig

交换排序之高速排序

今天大鹏哥跟大家一起学习下交换排序中的高速排序. 高速排序是对冒泡排序的一种改进.它的基本思想是.通过一趟排序将待排记录切割成独立的两部分,当中一部分记录的keyword均比还有一部分的keyword小.则可分别对这两部分记录继续进行排序,以达到真个序列有序. 高速排序基本步骤: Step1.定义两个变量low和high,他们的初值分别为low和high,此外另一个变量pivotkey. Step2.首先从high所指位置向前搜索找到第一个keyword小于pivotkey的记录和pivotke

高速排序(Java版)

package com.love.test; import java.util.Scanner; /** * @author huowolf *高速排序实现 *快排是十分优秀的排序算法. *核心:分治法(1.选基元2.分区3.递归子列) */ public class QuickSort { public static void quickSort(int[] arr,int start ,int end) { if(start<end) { int i=start, j=end, x=arr[