关于快排的递归实现

关于快排的递归实现

关于快排的递归实现

Table of Contents

1 引子

自己以前写过一篇关于快速排序的blog,但是没采用递归,而且当时的blog是完全手写的.但是现在都用Emacs工作,所以就分开了.

虽然以前写过快排,但是过了一段时间再来写,虽然有递归的引子,但还是对递归的初始入口不会,始终不得其解,还是在参看了以前的代码才写了出来.

2 源码

快速排序的递归实现:

 1:  #include <stdio.h>
 2:  #include <stdlib.h>
 3:  
 4:  /**
 5:    * 根据哨兵对数组进行划分,左小右大
 6:    * @param num   int*   待排序数组
 7:    * @param start int    待排序数组的起点
 8:    * @param end   int    待排序数组的终点
 9:    *
10:    * @return  int    进行完一次划分后,所选哨兵在数组中所在的索引,用来划分数组,左小右大
11:    */
12:  int quicksort(int* num,int start,int end)
13:  {
14:    int i = start,j = end;
15:    int temp = num[start]; //每次的哨兵选择待排序数组的第一个数
16:    while(i < j)
17:    {
18:        while(num[j] > temp && j > i)
19:            j--;
20:        if(j > i)
21:            num[i++] = num[j];
22:        while(num[i] < temp && j > i)
23:            i++;
24:        if(j > i)
25:        num[j--] = num[i];
26:    }
27:    num[i] = temp;
28:    return i; //哨兵的索引
29:  }
30:  
31:  /**
32:    * 递归调用实现排序
33:    * @param 同quicksort
34:    *
35:    */
36:  int sort(int* num,int start,int end)
37:  {
38:    int index;
39:    if(start < end)   //注意递归的入口
40:    {
41:        index = quicksort(num,start,end);
42:        sort(num,start,index-1);
43:        sort(num,index+1,end);
44:    }
45:    return 0;
46:  }
47:  
48:  int main()
49:  {
50:    int i,num[10] = {1,4,2,56,32,67,43,87,96,11};
51:  
52:    sort(num,0,9);
53:  
54:    for(i = 0; i < 10; i++)
55:        printf("%d ",num[i]);
56:    return 0;
57:  }

平均时间复杂度:O(nlog(n));

Date: 2014-08-25 Mon

Author: Chen Jingran

Org version 7.8.11 with Emacs version 24

Validate XHTML 1.0
posted @ 2014-08-25 22:23  Programmer-cjr  阅读(641)  评论(0编辑  收藏  举报