算法导论笔记(三) : 快速排序

1 快速排序简介

快速排序的最坏情况的运行时间为O(n^2),虽然这个最坏情况运行时间比较差。

但快速排序通常是用于排序的最佳的实用选择.这是因为其平均性能相当好.期望的

运行时间为O(nlgn)并且隐含的常数因子比较小.并且快速排序是就地排序.

2 快速排序过程

快速排序基于以下分治模式:

(i) 分解 : 数组A[p,r]被划分为两个子数组A[p,q-1](所有元素小于A[q])和A[q+1,r](所有元素大于A[q]),

(ii)解决 : 通过递归调用快速排序.对子数组A[p,q-1]和A[q+1,r]进行排序.

(iii)合并:由于是原地排序因此不需要合并.

3 代码实现

#ifndef __QUICKSORT_H__
#define __QUICKSORT_H__

#include <malloc.h>
#include <cstdio>
#include <time.h>
#include <stdlib.h>

class Quicksort
{
  int* m_data;
  int m_arraySize;
public:
  Quicksort(int size);
  ~Quicksort();
  void Sort(int start,int end);
  bool Verify();
  int Partition(int start,int end);
  void Create();
};

#endif

#include "Quicksort.h"

Quicksort::Quicksort(int size)
{
  m_arraySize = size;
  m_data = (int *)malloc(sizeof(int)*size);
}

Quicksort::~Quicksort()
{
  if(m_data)
  {
    free(m_data);
  }
}

void Quicksort::Sort(int start,int end)
{
  int q;
  if(start < end)
  {
    q = Partition(start,end);
    Sort(start,q-1);
    Sort(q+1,end);
  }
}

int Quicksort::Partition(int start,int end)
{
  int x = m_data[end];
  int i = start-1;
  int swapTmp;
  for(int j= start;j<end;j++)
  {
    if(m_data[j]<=x)
    {
      i++;
      swapTmp = m_data[i];
      m_data[i] = m_data[j];
      m_data[j] = swapTmp;
    }
  }
  swapTmp = m_data[i+1];
  m_data[i+1] = m_data[end];
  m_data[end] = swapTmp;
  return i+1;
}

bool Quicksort::Verify()
{
  int oldValue = m_data[0];
  for(int i=1;i<m_arraySize;i++)
  {
    if(m_data[i]<oldValue)
    {
      return false;
    }
    oldValue = m_data[i];
  }
  return true;
}

void Quicksort::Create()
{
  srand((unsigned)time(NULL));
  for(int i=0;i< m_arraySize;i++)
  {
    m_data[i] = rand();
  }
}

#include "Quicksort.h"

int main()
{
  int size = 1000 * 1000;
  Quicksort pSort(size);
  pSort.Create();
  pSort.Sort(0,size-1);
  if(pSort.Verify())
  {
    printf("success \n");
  }
  else
  {
    printf("error \n");
  }
  return 0;
}


4 性能分析

(i) 最佳情况 :每一次划分得到的两个子数组大小相等。此时快速排序的时间为O(nlgn)

(ii)最坏情况 :每次划分的n个元素被划分成长度为1和n-1的两个子数组,此时快速排序的时间为O(n^2)

(iii)平均情况:输入数组是随机的,此时快速排序的运行时间为O(nlgn).此时常数因子略大于最佳情况.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值