快速排序是排序算法中比较常见的一种排序方法,是对冒泡排序的一种改进。

      基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

     下面我用OC语言写了一个小demo,对字符串类型的数组进行快速排序,以达到数组升序排序的目的,在递归排序中并没有创建新的临时数组,而是在排序中直接移动数组元素,这样在降低空间复杂度上有一定效果。主要的步骤有:

     1)判断数组的合法性 .

       

-(void)sortInMiddle:(NSMutableArray *)array
{
    //判断参数合法性
    if (nil==array ||0==array.count) {
        return;
    }
    [self doSortInMiddle:array withStartIndex:0 withEndIndex:array.count-1];
}

 

 

 

     2)以数组中第一个数据元素为基准数据进行遍历排序,遇到比基准数据小的数组元素移动到数组的左侧,遇到比基准数据大的元素则不变动,这样通过一次遍历可以将数组以基准数据为中心分成两个部分,左边部分数据全部小于右边部分数据.

     3)递归步骤(2).

-(void)doSortInMiddle:(NSMutableArray *)array withStartIndex:(int)start withEndIndex:(int)end
{
    if(start>=end)
    {
        return;
    }
    //以第一个数据为基准数据,从左至右进行遍历比较,大的数据不动,小的移动到基准数据左侧
    int loop=start+1;
    int middle=start;
    NSComparisonResult  comparisonResult;
    
    while (loop<=end) {
        NSString *s1=[array objectAtIndex:loop];
        NSString *s2=[array objectAtIndex:middle];
        comparisonResult=[s1 compare:s2];
        
        if(comparisonResult==NSOrderedAscending)
        {
            [array insertObject:s1 atIndex:start];
            [array removeObjectAtIndex:loop+1];
            middle++;
        }
        loop++;
    }
    [self doSortInMiddle:array withStartIndex:start withEndIndex:middle-1];
    [self doSortInMiddle:array withStartIndex:middle+1 withEndIndex:end];
}

 

 main函数中对快速排序进行测试:

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        FastSortObject *fastSortObject=[[FastSortObject alloc] init];
        NSMutableArray *array=[[NSMutableArray alloc] initWithObjects:@"2",@"1",@"4",@"1",@"2",@"8",@"6",@"9",@"4", nil];
        NSLog(@"快速排序前:%@",array);
        [fastSortObject sortInMiddle:array];
        NSLog(@"快速排序后:%@",array);
    }
    return 0;
}

 测试结果如下:

2014-01-21 17:10:05.091 FastSort[998:303] 快速排序前:(
    2,
    1,
    4,
    1,
    2,
    8,
    6,
    9,
    4
)
2014-01-21 17:10:05.095 FastSort[998:303] 快速排序后:(
    1,
    1,
    2,
    2,
    4,
    4,
    6,
    8,
    9
)

 

http://www.2345.com/?k328314819

 

 

posted on 2014-01-21 17:15  肉丝  阅读(121)  评论(0)    收藏  举报