Chinaunix首页 | 论坛 | 博客
  • 博客访问: 183170
  • 博文数量: 67
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 622
  • 用 户 组: 普通用户
  • 注册时间: 2014-11-19 19:12
文章分类

全部博文(67)

分类: C/C++

2015-04-15 17:09:27


         假设针对int arr[]在[l, h)区间升序排序

         步骤1、取arr[l],将其移动到位置m,使m的左边都小于arr[l],右边都大于arr[l]
         步骤2、[l, m)、[m+1, h)区间重复步骤1
        可见,这是一个递归过程,代码如下:
        int arr[] = {8,1,3,6,9,0,4,7,5,2}; 
        int len = sizeof(arr)/sizeof(arr[0]);
        int find(int l, int h)     
        {
            if(l >= h ) return -1;
            int m = l, falg = 0, key = arr[l], t = 0;
            for(int i = l; i < h; i++)
            {
                if( flag == 0)
                {
                    if( arr[i] < key) 
                        ++m;
                    else
                        flag = 1; //表示接下来 arr[i] < key的要交换了
                }
                else
                {
                    if( arr[i] < key) 
                    {
                        ++m;
                        t = arr[i]; arr[i] = arr[m]; arr[m] = t;
                    }
                }
            }
            arr[l] = arr[m]; arr[m] = key;
            find(l, m);
            find(m+1, h); 
        }

注意点:针对每个元素都是先确定其位置,最后交换,不要在循环中频繁交换。
阅读(1488) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~