码迷,mamicode.com
首页 > 编程语言 > 详细

快速排序

时间:2015-11-17 12:37:21      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:

快速排序的基本思想为分治法。通过不断的划分,以及对子数组的排序,来实现对整个数组的排序。归并排序也是分治法的思想,相反的,归并是将小的数组不断的合并来实现排序。

 void quicksort(int data[], int left, int right)
{
    if(left >= right)//当数组中的个数为0时,什么也不做
        return;
    int pivot = data[left];
    int i = left;
    int j = right;
//1. divide: 以数组第一个元素为基准,将数组划分成两个部分,左边的数<= pivot <= 右边的数
while(i < j) {
//划分的时候,先移动右边的指针
while(data[j] >= pivot && j >= i) j--; if(i < j) { int tmp = data[i]; data[i] = data[j]; data[j] = tmp; } while(data[i] <= pivot && i <= j) i++; if(i < j) { int tmp = data[i]; data[i] = data[j]; data[j] = tmp; } }
//2. conquer: 对两个子数组进行递归排序 quicksort(data, left, i); quicksort(data, i
+ 1, right); }

注:当以左边第一个元素为pivot,在划分数组时,先移动右边的指针

对 data = [ 1 0 4 ]进行排序,pivot = 1, i = 0, j = 2

假如先移动i,因为data[0]和data[1]都小于等于1,所以i = 2。接下来移动j, data[2] > 1,所以j = 1。因为i > j,不进行交换。循环的结果仍然为1 0 4。相反的,先移动j,j = 1,data[j] < pivot,交换得到[0 1 4]。移动i,得到i = 2,j = 1,不交换。循环的结果为0 1 4。

快速排序

标签:

原文地址:http://www.cnblogs.com/coolqiyu/p/4971074.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!