【Algorithm】快速排序

一. 算法描述

  快速排序:快速排序采用分治法进行排序,首先是分割,选取数组中的任意一个元素value(默认选用第一个),将数组划分为两段,前一段小于value,后一段大于value;然后再分别对前半段和后半段进行递归快速排序。其实现细节如下图所示:

二. 算法实现

/*=============================================================================
#
#     FileName:   fastSort.c
#     Algorithm:  快速排序
#     Author:     Knife
#     Created:    2014-06-16 21:24:02
#
=============================================================================*/
#include<stdio.h>
void fastSortImp(int* intArrStart, int len);
void main(){
    int intArr[] = {8,3,6,4,2,9,5,4,1,7};
    int n = sizeof (intArr) / sizeof (intArr[0]); // 数组长度
    int i = 0;
    //快速排序
    fastSortImp(intArr,n);
    //打印输出
    for(;i<n;i++){
        printf("%d ",intArr[i]);
    }
    printf("\n");
}

//快速排序,应该分为两步:首先找到分割点,然后在对分割点的左侧和右侧分别进行递归
void fastSortImp(int* intArrStart, int len){
    if(len > 1){
        int i = 0;
        int j = len-1;
        int intTmp = intArrStart[0];
        while(j > i){
            // 从右向左查找比intTmp小的
            while(j > i && intArrStart[j] >= intTmp){
                j--;
            }
            if(j >i ){
                intArrStart[i] = intArrStart[j];//将s[j]填到s[i]中,s[i]就形成了一个新的坑
                i++;
            }
            // 从左向右查找比intTmp大的
            while(j > i && intArrStart[i] <= intTmp){
                i++;
            }
            if(j > i){
                intArrStart[j] = intArrStart[i];//将s[i]填到s[j]中,s[j]就形成了一个新的坑
                j--;
            }
        }

        intArrStart[i] = intTmp;//找到分割点。此时 i等于j。将intTmp填到这个坑中
        // 前半段
        fastSortImp(intArrStart, i);
        // 后半段
        fastSortImp(intArrStart + i + 1, len - i-1);

    }
}

三. 算法分析

  • 平均时间复杂度:O(nlog2n)
  • 空间复杂度:O(n)
  • 稳定性:不稳定

参考资料

  [1] http://blog.csdn.net/cjf_iceking/article/details/7925470

  [2] http://blog.csdn.net/morewindows/article/details/6684558

  [3] http://baike.baidu.com/view/19016.htm

【Algorithm】快速排序,布布扣,bubuko.com

时间: 2024-08-07 16:06:57

【Algorithm】快速排序的相关文章

Algorithm --&gt; 快速排序

快速排序 算法思想 快速排序采用的思想是分治思想. 快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的 元素值都不小于基准值,如此作为基准的元素调整到排序后的正确位置.递归快速排序,将其他n-1个元素也调整到排序后的正确位置.最后每个元素都是在排序后的正 确位置,排序完成.所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归. 举例说明一下吧,这个可能不是太好理解.

快速排序(JAVA)

package org.rev.algorithm; /**  * 快速排序 算法复杂度Ο(n log n)  *   * 1.挑出一个基准数据.  *   * 2.给数列排序,大于基准数据的放在右边,小于基准数据的放在左边.  *   * 3.递归地,对小于基准数据的子数列和大于基准数据的子数列排序.  */ public class QuickSort {   public static void main(String[] args) {     int[] data = {39, 38,

算法知识目录整理

算法知识目录整理 1. 算法部分 二分搜索 Binary Search 分治 Divide Conquer 宽度优先搜索 Breadth First Search 深度优先搜索 Depth First Search 回溯法 Backtracking 双指针 Two Pointers 动态规划 Dynamic Programming 扫描线 Scan-line algorithm 快速排序 Quick Sort 2. 数据结构部分 栈 Stack 队列 Queue 链表 Linker List 数

普林斯顿大学算法课 Algorithm Part I Week 3 快速排序 Quicksort

发明者:Sir Charles Antony Richard Hoare 基本思想: 先对数据进行洗牌(Shuffle the array) 以数据a[j]为中心进行分区(Partition),使得a[j]左侧的数据都小于等于a[j],a[j]右侧的数据都大于等于a[j] 分区完后递归排序 演示(Quicksort partitioning demo) 重复操作指导i和j指针相遇 当a[i] < a[lo]时,令i从左往右扫描 当a[j] > a[lo]时,令j从右往左扫描 交换a[i]和a[

Algorithm: quick sort implemented in python 算法导论 快速排序

1 import random 2 3 def partition(A, lo, hi): 4 pivot_index = random.randint(lo, hi) 5 pivot = A[pivot_index] 6 A[pivot_index], A[hi] = A[hi], A[pivot_index] 7 store_index = lo 8 for i in range(lo, hi): 9 if A[i] < pivot: 10 A[i], A[store_index] = A[

快速排序的实现(不保证效率

众所周知,快速排序的核心是分治的思想,选一个基准出来,然后通过划分操作,使得,该元素最终处于的位置的左边的元素都小于等于它,右边的元素都大于等于它 划分操作就是两次递归嘛,没什么的,关键在于不借助外部空间我们如何实现划分操作 首先我们不知道该元素放在哪里,显然这是最后才能确定的, 我了解到一种填坑法的实现... 那就是首先保存第一个位置的值,然后从后向前扫描第一个小于x的值,我们就可以直接覆盖第一个位置的值,然后我们再从前向后找大于x的值, 把后面的坑填上 下面枚举几种情况 基准前后有相同数量的

c++快速排序(从大到小greater/从小到大less)

#include <iostream> #include<algorithm>//sort函数的头文件 #include<functional>//greater/less的头文件 using namespace std; int main() { int a[10]={0}; int i; for(i=0;i<10;i++) cin>>a[i]; sort(a,a+10,greater<int>());//快速排序 for(i=0;i&l

数据结构(DataStructure)与算法(Algorithm)、STL应用

catalogue 0. 引论 1. 数据结构的概念 2. 逻辑结构实例 2.1 堆栈 2.2 队列 2.3 树形结构 2.3.1 二叉树 3. 物理结构实例 3.1 链表 3.1.1 单向线性链表 3.1.2 单向循环链表 3.1.3 双向线性链表 3.1.4 双向循环链表 3.1.5 数组链表 3.1.6 链表数组 3.1.7 二维链表 3.2 顺序存储 4. 算法 4.1 查找算法 4.2 排序算法 0. 引论 0x1: 为什么要学习数据结构 N.沃思(Niklaus  Wirth)教授提

用快速排序法寻找第k大元素

#include<iostream> #include<algorithm> #include<iterator> #include<cstdio> using namespace std; // 求首元素.中间元素和尾元素的中位数,将中位数与首元素交换位置 inline void medianAsPivot(int arr[], const int& left, const int& right) { const int middle =