C++算法之 快速排序

快速排序的思想:

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

主要思路:

先从后面开始遍历找到比key值小的一个值,把这个值放到key的前面,再从前面开始遍历找比key大的值;

代码如下:

// QuickSort.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;

void QuickSort(int a[], int start,int end)
{
    if (start > end)
    {
        return;
    }

    int i = start;
    int j = end;
    int k = a[i];
    while (i < j)
    {
        while (i < j && a[j] > k)//先从后面开始找小于k的值
                    j--;
        a[i] = a[j];//找到小于k的值,替换a[i]
        while (i < j && a[i] < k)//从前面找大于k的值
                    i++;
        a[j] = a[i];//找到大于k的值,刚才a[j]的值已经赋刚才的a[i];a[j]的值用现在找到的大于k的值填充
    }
    a[j] = k;//最后i = j; 把k的值赋给a[i];

    QuickSort(a,i+1,end);
    QuickSort(a,start,i-1);

}

int _tmain(int argc, _TCHAR* argv[])
{
    int a[] = {1,3,5,7,9,2,4,6,8,0};
    int len=sizeof(a)/sizeof(a[0])-1;
    for(int i=0;i<=len;i++)
    {
        cout<<a[i]<<" "; 

    }
    cout<<endl;
    cout<<"快速排序后:"<<endl;
    len=sizeof(a)/sizeof(a[0])-1;
    QuickSort(a,0,len);
    for(int i=0;i <= len;i++)
    {
        cout<<a[i]<<" ";
    } 

    getchar();
    return 0;
}

时间: 2024-12-18 23:34:56

C++算法之 快速排序的相关文章

排序算法 之 快速排序

快速排序是基于分治思想的一种排序算法,就像该方法的名字一样,速度比较快,所以叫做快速排序:它的平均时间复杂度为O(N*logN),最坏时间复杂度为O(n2),由于快速排序在序列元素数量多的时候速度比较快,所以很多语言内置的排序方法也是用快速排序实现的.快速排序也有很多优化的版本,比如在排序时基数的选择等等-下面就说一下一般的快速排序的实现. 基本思想: 快速排序的基本思想就是,先从待排序的序列中任选一个元素作为基数,然后将序列中的其他小于基数的元素放在基数的左边,大于或等于基数的元素放在基数的右

算法:快速排序

原理: 在一个数组中,选一个元素(通常是第一个元素或者数组的中间元素)与剩余的其它元素进行比较:建立两个分组(左组和右组),比当前元素小的放在左组,比当前元素大的放在右组.这样一来,将左组,中间组合右组合并起来就形成一个已经“排好序”的数组.实际上,左组和右组中的元素并不一定已经排好序,调用自己去排序,只有左右数组的元素个数大于1,就需要排序,如果元素个数等于一个,就不再调用函数. 使用递归实现(步骤): 1.实现从数组中取出一个元素:将小的放左边数组,大的放右边数组,最后返回合并结果 2. 

十大基础实用算法之快速排序和堆排序

快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来. 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists). 算法步骤: 1 从数列中挑出一个元素,称为 "基准"(pi

经典白话算法之快速排序

[分析] [伪代码] [运行过程] [代码] /********************************* * 日期:2014-04-01 * 作者:SJF0115 * 题目:快速排序 **********************************/ #include <iostream> #include <stdio.h> using namespace std; //对子数组array[p...r]就地重排 int Partition(int array[],i

啊哈!算法之快速排序与桶排序

啊哈!算法之快速排序与桶排序 1.快速排序算法 快速排序由 C. A. R. Hoare(东尼·霍尔,Charles Antony Richard Hoare)在1960 年提出,之后又有许多人做了进一步的优化.在数列种随机找出一个基准数,因为数列是杂乱的,所以取首项为基准数.从后往前找到比基准数大的位置,再从前往后找到比基准数小的位置,交换元素:右游标向前移动与左游标向后移动,它们相遇时用基准数的位置与相遇的位置交换.此时原来数列以相遇的位置被划分为了两个需要排序的数列,再次执行上述过程:当左

排序算法 一 快速排序

算法:快速排序 思想:通过一趟排序,确定了一个data的最终确切位置.(通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列)  特点:不稳定算法. 代码实现:

算法之快速排序

这里简单的介绍下快速排序的伪代码实现和示意图: QuickSort(A,p,r) if p<r q=Partition(A,p,r) QuickSort(A,p,q-1) QucikSort(A,q+1,r) 算法的关键部位为Partition函数的实现,它实现了对数组A(p,r)的原址排序: Partition(A,p,r) x=A[r] i=p-1 for j=p to r-1 if a[j]<=x i=i+1 exchange a[i] with a[j] exchange A[i+1]

常用排序算法之——快速排序(C语言+VC6.0平台)

经典排序算法中快速排序具有较好的效率,但其实现思路相对较难理解. #include<stdio.h> int partition(int num[],int low,int high) //以key为基准 将待排数列“高”.“低 ”两部分,“高”部分的所有数据比key大,“低”部分的数据都比key小 { int left,right,key; left=low;right=high;key=num[low]; while(left<right) { while(left<right

常用排序算法之——快速排序

快速排序的原理: 首先找一个标兵值,等于某一个元素值:遍历数组,将数组分为小于标兵值和大于标兵值的两部分:然后分别对两个部分采用快速排序,递归. 分开数组时,维持一个指针,指向已找到小部分的最后一个元素:一个指针用于遍历. 不稳定排序算法.当数组已经有序时,时间复杂度最差,为O(N2),平均.最优情况下都为O(N lgN). 代码如下: 1 #include <iostream> 2 using namespace std; 3 4 template<typename T> 5 v

排序算法系列——快速排序

记录学习点滴 快速排序算法是一种很有趣的算法,短小精悍,性能强劲,对于大部分情况都可以胜任,但对极端环境难以应付. 快速排序我理解为:这是一个“以自我为中心的”+“分治法”思想的算法. 分治法不必多说,化繁为简,那就是逐个击破. 那什么是“以自我为中心”?顾名思义,就是每次都一个“我”,每个人都要围绕“我”行事,比“我”小的都去左边站着,比“我”他大的都去右边站着,而且“我”不去关心每一边都有谁,反正你没“我”大或者小就行.一旦“我”落位了妥帖了,“我”就不动了.然后再在左右两边分别产生新“我”