| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 781 人关注过本帖
标题:(分享)快速排序的最原始实现, 不带优化的
只看楼主 加入收藏
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
结帖率:94.72%
收藏
已结贴  问题点数:20 回复次数:5 
(分享)快速排序的最原始实现, 不带优化的
各种排序是常见的面试题, 我希望能够帮助大家轻松的秒杀那些小菜鸟

//快速排序的划分过程 属于 前序遍历二叉树。/

#include <stdio.h>
#include <stdlib.h>

#define MAX_NUM 15

#define less(A, B) ((A) < (B))
#define exch(A, B) {char t = A; A = B; B = t;}

void quickSort(char a[], int left, int right);

int partition(char a[], int left, int right);

int main(void)
{
    char a[MAX_NUM+1] = "ASORTINGEXAMPLE";
    int i;

    quickSort(a, 0, MAX_NUM-1, 1);
   
    for (i = 0; i < MAX_NUM; i++)
    {
        printf("%c ", a[i]);
    }

    getchar();
    return 0;
}

int partition(char a[], int left, int right)
{
    int i = left-1, j = right;
    char v = a[right];

    while(1)
    {
        while (less(a[++i], v))
        {   
            continue;
        }

        while (less(v, a[--j]))
        {   
            if (j == left)
                 break;
        }

        if (i >= j)
        {   
            break;
        }

        exch(a[i], a[j]);
    }

    exch(a[i], a[right]);

    return i;
}

void quickSort(char a[], int left, int right)
{
    int i;

    if (right <= left)
        return;

    i = partition(a, left, right);
    quickSort(a, left, i-1);
    quickSort(a, i+1, right);
}

快速排序子文件结构:
 ASORTINGEXAMPLE
 AAE
 AA
     TINGOXSMPLR
     LINGOPM
     LIG
      IL
         OPN
          PO
             XTS
              TX

快速排序子文件排序过程
 AAEETINGOXSMPLR
 AAE
 AA
     LINGOPMRXTS
     LIGMOPN
     GIL
      IL
         NPO
          OP
             STX
              TX

如果按照正序/逆序文件调用排序函数, 那么快速排序的复杂度会退化为 0(n^2), 当然这里只是泛泛的说法,/
如下
 abcdefghijklmno
 abcdefghijklmn
 abcdefghijklm
 abcdefghijkl
 abcdefghijk
 abcdefghij
 abcdefghi
 abcdefgh
 abcdefg
 abcdef
 abcde
 abcd
 abc
 ab

onmlkjihgfedcba
  nmlkjihgfedcbo
  nmlkjihgfedcb
   mlkjihgfedcn
   mlkjihgfedc
    lkjihgfedm
    lkjihgfed
     kjihgfel
     kjihgfe
      jihgfk
      jihgf
       ihgj
       ihg
        hi

aaaaaaaaaaaaaaa
 aaaaaaa
 aaa
     aaa
         aaaaaaa
         aaa
             aaa

[ 本帖最后由 BlueGuy 于 2011-1-8 13:07 编辑 ]
搜索更多相关主题的帖子: 二叉树 小菜 
2011-01-08 12:08
li_danwang
Rank: 4
来 自:鄂州
等 级:业余侠客
帖 子:112
专家分:203
注 册:2010-11-12
收藏
得分:5 
清晰明了

没事来C一下...   
2011-01-08 12:55
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
以下是引用li_danwang在2011-1-8 12:55:28的发言:

清晰明了
谢谢谬赞~~

我就是真命天子,顺我者生,逆我者死!
2011-01-08 12:57
a343637412
Rank: 7Rank: 7Rank: 7
来 自:そ ら
等 级:黑侠
帖 子:357
专家分:620
注 册:2010-9-26
收藏
得分:5 








                                                        来学习的
2011-01-08 13:13
点线面
Rank: 8Rank: 8
来 自:NO.-1
等 级:蝙蝠侠
帖 子:525
专家分:980
注 册:2011-1-3
收藏
得分:5 
void quickSort(char a[], int left, int right)
{
    int i;

    if (right <= left)
        return;

    i = partition(a, left, right);
    quickSort(a, left, i-1);
    quickSort(a, i+1, right);
}
后面那个函数分析起,头大

小代码,大智慧
2011-01-08 18:09
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:5 
以下是引用点线面在2011-1-8 18:09:28的发言:

void quickSort(char a[], int left, int right)
{
    int i;

    if (right <= left)
        return;

    i = partition(a, left, right);
    quickSort(a, left, i-1);
    quickSort(a, i+1, right);
}
后面那个函数分析起,头大

按楼主的顺序,这后面就没函数了。你问哪个?
2011-01-09 02:08
快速回复:(分享)快速排序的最原始实现, 不带优化的
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019980 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved