快速排序是排序算法中比较常见的一种排序方法,是对冒泡排序的一种改进。
基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
下面我用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
浙公网安备 33010602011771号