三天一算法:快速排序

 i--->   6, 5, 7, 8, 3 , 2 , 9 , 10   <----j
首先以第一个为基准值 6

1:           j从右边出发,在j移动到2的时候发现小于6,j停了下来,

然后i开始移动,当i移动到7的时候发现大于6,于是i也停了下来

然后i和j交换了他们所代表的值

6, 5, 7, 8, 3 , 2 , 9 , 10 -->   6, 5, 2, 8, 3 , 7 , 9 , 10

2:          然后j继续向左移动,在移动到3的时候发现小于6,j停了下来,

i也继续移动,当移动到8的时候发现大于6,于是i又停了下来

i和j交换了他们所代表的值

6, 5, 2, 8, 3 , 7 , 9 , 10   -->  6, 5, 2, 38 , 7 , 9 , 10

3:             继续,j继续向左移动,当移动到3的时候i == j,循环结束

这个时候呢,我们要把i代表的值和基准值进行交换

6, 5, 2, 3, 8 , 7 , 9 , 10   -->  3, 5, 2, 6, 8 , 7 , 9 , 10

在这个的整个过程中呢,6我们已经找好了它的位置,我们就不在管它了,于是我们把6前后分成了2组,[3,5,2] 和[8, 7, 9, 10]

我们再继续对[3, 5, 3]和[8, 7, 9, 10]重新上面的过程,最后我们就能得到最终结果:2,3,5,6,7,8,9,10

#include<iostream>
using namespace std;

int a[] = {6, 5, 7, 8, 3, 2, 9, 10 };

void QuickSort(int left, int right)
{
    if (left >= right) //如果left >= right就没有必要交换了,因为本身已经排序了
        return;

    int guard = a[left];
    int i = left;
    int j = right;

    while (i != j) {
        while (a[j] >= guard && i < j) //保证每次要先从右边开始遍历
            j--;
        while (a[i] <= guard && i < j)
            i++;

        if (i < j) {
            int t = a[i];
            a[i] = a[j];
            a[j] = t;
        }
    }

    a[left] = a[i]; //结束后要把基准值和当前的那个值进行交换
    a[i] = guard;

    QuickSort(left, i - 1);
    QuickSort(i+1, right);
}

int main()
{
    QuickSort(0, sizeof(a)/sizeof(int) -1);
    for (int i = 0; i < sizeof(a)/sizeof(int) ;i++ )
        cout << a[i] << " " ;
    cout << endl;
}
时间: 2024-11-26 12:36:10

三天一算法:快速排序的相关文章

快速排序、归并排序、堆排序三种算法性能比较

快速排序.归并排序.堆排序三种排序算法的性能谁最好呢?网上查了一下说快速排序最快.其次是归并排序,最差的是堆排序:而理论上三种排序算法的时间复杂度都是O(nlogn),只不过快速排序最差的会达到O(n^2),但是数据的随机性会消除这一影响,今天就来实际比较一下: 1 #include <iostream> 2 #include<time.h> 3 using namespace std; 4 #define MAX 100000000 5 int data1[MAX],data2[

小橙书阅读指南(六)——快速排序和三向切分快速排序

算法描述:快速排序是一种分治的排序算法.它将数组分为两个子数组,并将两部分独立的排列.快速排序和归并排序是互补的:归并排序将数组分成两个子数组分别排序,并将子数组归并以将整个数组排序:而快速排序将数组排序的方式则是当两个子数组都有序时整个数组也就自然有序了. 算法图示: 算法解释:选择标的元素(5)并且便利数组,将素有小于5的元素都安排在它的左侧,而大于5的元素都安排在它的右侧.之后再通过递归的方法分别处理左边的子数组和右边的子数组. 快速排序的算法难点在于尽量不要使用额外的存储空间(即保证原地

最近公共祖先(三种算法)

最近研究了一下最近公共祖先算法,根据效率和实现方式不同可以分为基本算法.在线算法和离线算法.下面将结合hihocoder上的题目分别讲解这三种算法. 1.基本算法 对于最近公共祖先问题,最容易想到的算法就是从根开始遍历到两个查询的节点,然后记录下这两条路径,两条路径中距离根节点最远的节点就是所要求的公共祖先. 题目参见 #1062 : 最近公共祖先·一 附上AC代码,由于记录的方式采取的是儿子对应父亲,所以实现的时候有点小技巧,就是对第一个节点的路径进行标记,查找第二个节点的路径时一旦发现访问到

Opencv——彩色图像灰度化的三种算法

为了加快处理速度在图像处理算法中,往往需要把彩色图像转换为灰度图像.24为彩色图像每个像素用3个字节表示,每个字节对应着RGB分量的亮度. 当RGB分量值不同时,表现为彩色图像:当RGB分量相同时,变现为灰度图像: 一般来说,转换公式有3中. (1)Gray(i,j)=[R(i,j)+G(i,j)+B(i,j)]/3; (2)Gray(i,j)=0.299*R(i,j)+0.587*G(i,j)+0.144*B(i,j); (3)Gray(i,j)=G(i,j);//从2可以看出G的分量比较大所

Java利用 DES / 3DES / AES 这三种算法分别实现 对称加密

转载请注明出处:http://blog.csdn.net/smartbetter/article/details/54017759 有两句话是这么说的: 1)算法和数据结构就是编程的一个重要部分,你若失掉了算法和数据结构,你就把一切都失掉了. 2)编程就是算法和数据结构,算法和数据结构是编程的灵魂. 注意,这可不是我说的,是无数程序员总结的,话说的很实在也很精辟,若想长久可持续发展,多研究算法还是很有必要的,今天我给大家说说加密算法中的对称加密算法,并且这里将教会大家对称加密算法的编程使用.包含

编程算法 - 快速排序算法 代码(C)

快速排序算法 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 经典的快速排序算法, 作为一个编程者, 任何时候都要完整的手写. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <stdio.h> #include <stdlib.h> int RandomInRange(int min,

Java算法快速排序

快速排序的原理:每次将序列以一个值为界限分成两组,在将两个序列分别以一个界限分成两组这样一直分下去. int[] a = {11,222,44,63,84,11,24,53,123,25,98,76,34}; 第一步:以34将数组a分成两组  11, 25, 24, 11              34,  63, 44, 53, 123, 222, 98, 76, 84 第二步:以11将11, 25, 24, 11分为两组  11, 11,     24, 25.以84将34,  63, 44

重点算法--快速排序

#include<iostream> using namespace std; ////写出快速排序,归并排序与堆排序 int adjustarray(int a[],int left,int right) { int x = a[left]; while(left < right) { while(a[right] > x && left < right) right--; ///注意这个小于的范围 if(left < right ) {a[left]

排序算法----快速排序java

快速排序是对冒泡排序的一种改进,平均时间复杂度是O(nlogn) import java.util.Arrays; import java.util.Scanner; public class test02{ public static void main(String[] args) { int n = 1; while (n != 0){ Scanner scanner = new Scanner(System.in); n = scanner.nextInt(); int s[] = ne