Quicksort的算法分析及C++实现

一、关于Quicksort的简单介绍

Quicksort算法属于divide and conquer算法,核心思想是取array中的一个元素作为pivot,然后把array除了pivot的其他元素与这个pivot进行比较,比pivot小的元素放在pivot左边,比pivot大的元素放在pivot的右边,我们就得到了两个subarray(左边和右边),然后再对新的subarray进行同样的操作,直到得到新array中只有一个元素。

二、quicksort的C++程序实现:

//
//  main.cpp
//  quicksort
//
//  Created by lingnan on 10/21/15.
//  Copyright (c) 2015 lingnan. All rights reserved.
//

#include <iostream>
using namespace std;

int partition(int arr[], int left, int right){
    int pivot = arr[right];                 //choose the rightest element as the pivot
    int curr = left;
    for(int i=left; i<right; i++){
        if(pivot > arr[i]){                 //always put smaller element in the left
            swap(arr[curr], arr[i]);
            curr++;
        }
    }
    swap(arr[curr], arr[right]);           //at last, put pivot element in the position it should be
    return curr;
}

void quicksort(int arr[], int left, int right){
    if(left < right){
        int p = partition(arr, left, right);
        quicksort(arr, left, p-1);
        quicksort(arr, p+1, right);
    }
}

void printArray(int arr[], int n){
      cout <<"The final result after quicksort is:" <<endl;
    for(int i=0; i<n; i++){
      cout <<arr[i] <<" ";
    }
}

int main(int argc, const char * argv[]) {
    int arr[] = {1,56,2,2,35,3,3,93};
    int n = sizeof(arr)/sizeof(arr[0]);      //get the number of elements in array
    quicksort(arr, 0, n-1);
    printArray(arr, n);
    return 0;
}

三、时间复杂度和空间复杂度

T(n) = T(k) + T(n-k-1) + O(n)

T(n)是一次quicksort的时间复杂度,O(n)是partition一次的时间(每次paritition都要遍历所有的元素),T(k) 和 T(n-k-1)是分别要继续遍历的两个新数组。

Worst Case:

T(n) = T(1) + T(n-2) + O(n)  ~ O(n^2)

每次只分出一个元素

Best Case:

T(n) = 2*T(n/2) + O(n)  ~ O(nlogn)

每次分出的两堆数量相似

Average Case:

O(nlogn)

空间复杂度:in place

时间: 2024-11-09 07:09:03

Quicksort的算法分析及C++实现的相关文章

算法分析之——quick-sort快速排序

快速排序是一种排序算法,最坏情况运行时间为θ(n2),但其最佳期望运行时间为θ(nlgn),并且θ(nlgn)记号中隐含的常数因子很小,快排是在就地排序的一种排序算法.快排是基于分治思想的,与归并排序一样.快速排序是一种不稳定的排序算法,因为算法实现过程中涉及到元素交换. 思路: (1)分解:数组A[n]被划分两个字数组A[0..q-1]和A[q+1..n],使得对于数组A[0..q-1]中的元素都小于A[q], A[q+1..n]中的元素都大于等于A[q].此时A[q]就得排好序. (2)解决

算法分析 - 快速排序QUICK-SORT

设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序.值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动. 一趟快速排序的算法是: 1)设置两个变量i.j,排序开始的时候:i=0,j=N-1: 2)以第一个数组元素作为关键数据,赋值给key,即key=A[0]: 3)从j开始向前搜索,即由后开始向前搜索(j-

【从零学习经典算法系列】分治策略实例——快速排序(QuickSort)

在前面的博文(http://blog.csdn.net/jasonding1354/article/details/37736555)中介绍了作为分治策略的经典实例,即归并排序,并给出了递归形式和循环形式的c代码实例.但是归并排序有两个特点,一是在归并(即分治策略中的合并步骤)上花费的功夫较多,二是排序过程中需要使用额外的存储空间(异地排序算法<out of place sort>). 为了节省存储空间,出现了快速排序算法(原地排序in-place sort).快速排序是由东尼·霍尔所发展的一

算法分析与设计——分治法实验报告

   算法导论  课程设计 成 绩 题    目:  算法导论课程设计实验报告 学院班级:        1613013         学    号:      16130130216       姓    名:        库 妍           主讲教师:        张立勇          日    期:       2019.6.3         录 分治法 一.Implement exercise 2.3-7................................

算法分析的正确姿势

[本系列博文会对常见的数据结构及相应算法进行分析与总结,并会在每篇博文中提供几道相关的一线互联网企业面试/笔试题来巩固所学及帮助我们查漏补缺.项目地址:https://github.com/absfree/Algo.由于个人水平有限,叙述中难免存在不清晰准确的地方,希望大家可以指正,谢谢大家:)] 一.前言 在进一步学习数据结构与算法前,我们应该先掌握算法分析的一般方法.算法分析主要包括对算法的时空复杂度进行分析,但有些时候我们更关心算法的实际运行性能如何,此外,算法可视化是一项帮助我们理解算法

算法分析与设计复习

算法分析与设计复习 2016年初,研一上学期期末考试前,复习并总结算法分析与设计科目的内容.复习过程参照<算法导论>中文第2版,同时参照PPT,章节划分根据PPT内容 概要: 第一章 概述 第二章 插入排序&分治策略 第三章 复杂度分析 第四章 堆与堆排序 第五章 快速排序 第六章 线性时间排序 第一章 概述 算法的应用范围 算法在诸如生物等诸多领域有其应用 算法的意义 算法在很多情况下让不可能完成的事情变成了可能,让处理的很慢的过程变快. 一个铺垫 一串不全为0的数,怎么取能拿到一段

拓扑排序之变量序列算法分析

拓扑排序之变量序列 巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 题目描述: 假设有n个变量(1<=n<=26,变量名用单个小写字母表示),还有m个二元组(u,v),分别表示变量u小于v.那么,所有变量从小到大排列起来应该是什么样子的呢? 例如有4个变量a,b,c,d,若以知a<b,c<b,d<c,则这4个变量的排序可能是a<d<c<b.尽管还有可能其他的可能,你只需找出其中的一个即可. 输入: 输入为一

某某水表-M1卡数据算法分析

# 某某水表-M1卡数据算法分析 ## 卡片数据-----------------------------扇区数据 | 金额:--- |:---13EC 0000 0000 0000 0000 0000 03EB BD1B | 51.0013E7 0000 0000 0000 0000 0000 03F0 AD2B | 50.9513E2 0000 0000 0000 0000 0000 03F5 AD2B | 50.8513DD 0000 0000 0000 0000 0000 03FA 9D

算法分析

算法就是一系列解决问题的指令,对于给定的输入,能够在有限时间内获得预期的输出.一个好的算法和一篇好的文章一样,都是不断努力,反复修正的结果.算法分析主要从运行时间和存储空间两方面讨论算法的效率.相信有些人会有跟我一样的感觉,对于一些算法,有时我们一眼就能看出它的时间复杂度,但就是无法比较规范的表达出来.本文就系统的整理一下如何规范推导算法的时间和空间复杂度. 算法分析的一个依据是,输入规模(又称问题规模,记为 n),根据直觉,程序的运行时间随着问题规模的增大而变长.那么怎么衡量程序的运行时间呢?