随感而发

杂七杂八

统计

留言簿(13)

阅读排行榜

评论排行榜

快速排序学习3(最初版)

这次学习了快速排序的最初版的思路,基本也一样,呵呵,不过他在分割的时候,是两边同时进行而已。注意一点就是他只是分割的大小,但是在分割处并不是排好的数据,所以要注意一下,不能去掉该数据的迭代。
直接奉上源代码:
#include <stdio.h>
#include 
<stdlib.h>

//化分区间,找到最后元素的排序位置。并返回分隔的点(即最后一数据排序的位置)。
//划分的区间是[nBegin, nEnd). pData是保存数据的指针
int Partition(int* pData, int nBeging, int nEnd)
{
    
//这里是和hoare的最初快速排序的版本。
    int x = pData[nBeging];
    
--nBeging;

    
while (nBeging < nEnd)
    
{
        
--nEnd;
        
//从后向前,找到比X小的元素位置
        while(pData[nEnd] > x)
        
{
            
--nEnd;
        }


        
//小的区域增加,找到一个不比x小的元素
        ++nBeging;
        
while (pData[nBeging] < x)
        
{
            
++nBeging;
        }


        
//把不比x小的元素存放在大的区域内。nEnd刚好预留了此位置。
        if (nBeging < nEnd)
        
{
            
int nTemp = pData[nBeging];
            pData[nBeging] 
= pData[nEnd];
            pData[nEnd] 
= nTemp;
        }

        
else
        
{
            
break;
        }

    }


    
//注意这里并没有给分割点排序,只是做了分割,办证nEnd+1的左边小于
    
//nEnd + 1的右边。
    return nEnd + 1;   //返回nD的位置,就是分割的位置。
}


//排序的递归调用。
int QuickSortRecursion(int* pData, int nBeging, int nEnd)
{
    
if (nBeging >= nEnd -1)        //如果区域不存在或只有一个数据则不递归排序
    {
        
return 1;
    }


    
//也就是说他的左边的数据都小于等于他,他右边的数据都大于他。
    
//所以他不在递归调用的数据中。
    int i = Partition(pData, nBeging, nEnd);        //找到分割点
    QuickSortRecursion(pData, nBeging, i);            //递归左边的排序
    QuickSortRecursion(pData, i, nEnd);            //递归右边的排序
    return 1;
}


//快速排序
int QuickSort(int* pData, int nLen)
{
    
//递归调用,快速排序。
    QuickSortRecursion(pData, 0, nLen);
    
return 1;
}

int main()
{
    
int nData[10= {5,9,3,2,1,6,20,45,88,75};        //测试数据
    QuickSort(nData, 10);            //调用快速排序
    for (int i = 0; i < 10++i)        //输出结果
    {
        printf(
"%d ", nData[i]);
    }

    printf(
"\n");
    system(
"pause");
    
return 0;
}

posted on 2009-04-23 20:21 shongbee2 阅读(2681) 评论(0)  编辑 收藏 引用 所属分类: 数据结构和算法


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理