快速排序是當遇到較大數據時,排序快,高效的方法(公司面試時,基本上會被問到...)
該方法的基本思想是:
1.先從數列中取出一個數作為基準數。
2.分區過程,將比這個數大的數全放到它的右邊,小于或等于它的數全放到它的左邊。
3.再對左右區間重復第二步,直到各區間只有一個數。
簡單地理解就是,找一個基準數(待排序的任意數,一般都是選定首元素),把比小于等于基準數的元素放到基準數的左邊,把大于基準數的元素放在基準數的右邊.排完之后,在把基準數的左邊和右邊各看成一個整體, 左邊:繼續選擇基準數把小于等于基準數的元素放到基準數的左邊,把大于基準數的元素放在基準數的右邊,右邊也是一樣..直到各區間只有一個數位置.
快速排序之所比較快,因為相比冒泡排序,每次交換是跳躍式的。每次排序的時候設置一個基準點,將小于等于基準點的數全部放到基準點的左邊,將大于等于基準點的數全部放到基準點的右邊。這樣在每次交換的時候就不會像冒泡排序一樣每次只能在相鄰的數之間進行交換,交換的距離就大的多了。因此總的比較和交換次數就少了,速度自然就提高了。當然在最壞的情況下,仍可能是相鄰的兩個數進行了交換。因此快速排序的最差時間復雜度和冒泡排序是一樣的都是O(N2),它的平均時間復雜度為O(NlogN)。
圖片詮釋上面的思想
代碼實現:
define kSize 20
define kMax 100
-(void)viewDidLoad { [super viewDidLoad]; //初始化20個100以內的隨機數,放在data數組中 NSMutableArray *data = [[NSMutableArray alloc] initWithCapacity:kSize]; for (int i =0;i<kSize;i++) { u_int32_t x = arc4random() % kMax;//0~kMax NSNumber *num = [[NSNumber alloc] initWithInt:x]; [data addObject:num]; }
NSLog(@"排序前的數據:%@",[data description]); LZJSort *sort = [[LZJSort alloc] init]; [sort quickSortWithArray:data]; }
方法實現
-(void)quickSortWithArray:(NSArray *)aData{ NSMutableArray *data = [[NSMutableArray alloc] initWithArray:aData]; [self quickSortWithArray:data left:0 right:[aData count]-1]; NSLog(@"快速排序后的結果:%@",[data description]); } -(void)quickSortWithArray:(NSMutableArray *)aData left:(NSInteger)left right:(NSInteger)right{ if (right > left) { NSInteger i = left; NSInteger j = right + 1; while (true) { while (i+1 < [aData count] && [aData objectAtIndex:++i] < [aData objectAtIndex:left]) ; while (j-1 > -1 && [aData objectAtIndex:--j] > [aData objectAtIndex:left]) ; if (i >= j) { break; } [self swapWithData:aData index1:i index2:j]; } [self swapWithData:aData index1:left index2:j]; [self quickSortWithArray:aData left:left right:j-1]; [self quickSortWithArray:aData left:j+1 right:right]; } } -(void)swapWithData:(NSMutableArray *)aData index1:(NSInteger)index1 index2:(NSInteger)index2{ NSNumber *tmp = [aData objectAtIndex:index1]; [aData replaceObjectAtIndex:index1 withObject:[aData objectAtIndex:index2]]; [aData replaceObjectAtIndex:index2 withObject:tmp]; }