基本思想:
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
image实现方案
首先任意选择数组一个数据作为关键数据,然后将所有比他小的数据都放在他的前面,所有比他大的数据放到他后面面,这个过程称为一次快速排序,接下去就是类似的递归操作,排序完成一轮后key左右两边的值继续相同排序
OC:
NSMutableArray *arr = [[NSMutableArray alloc] initWithObjects:@(6), @(1),@(2),@(5),@(9),@(4),@(3),@(7),nil];
[self quickSortArray:arr withLeftIndex:0 andRightIndex:arr.count - 1];
- (void)quickSortArray:(NSMutableArray *)arr withLeftIndex:(NSInteger)leftIndex andRightIndex:(NSInteger)rightIndex {
if (leftIndex >= rightIndex) {
return;
}
NSInteger i = leftIndex;
NSInteger j = rightIndex;
NSInteger key = [arr[i] integerValue];
while (i < j) {
while (i < j && [arr[j] integerValue] >= key) {// 从右边开始查找比基准数小的值
j--;
}
// 谷歌币基准数小,则将查找到的小值调换到i的位置
arr[i] = arr[j];
while (i < j && [arr[i] integerValue] < key) {// 从左边开始查找比基准数大的值
i++;
}
arr[j] = arr[i];
}
arr[i] = @(key);//将基准数放到正确位置
// 第一次查找结束后进行左右两边查找,依次类推递归操作
[self quickSortArray:arr withLeftIndex:leftIndex andRightIndex:i - 1];
[self quickSortArray:arr withLeftIndex:i + 1 andRightIndex:rightIndex];
NSLog(@"%@", arr);
}
Python:
别喷,根据oc改写的,哈哈哈哈
arr = [7,5,8,4,3,6,9,2,1]
print(arr)
quick_sort(arr,0,len(arr)-1)
print(arr)
def quick_sort(array,low,high):
if low >= high:
return
i = low
j = high
key = arr[i]
while i < j:
while i < j and arr[j] >= key :
j = j - 1
arr[i] = arr[j]
while i < j and arr[i] <= key :
i = i + 1
arr[j] = arr[i]
arr[i] = key
#以上结束一轮
quick_sort(arr,low,i - 1)
quick_sort(arr, i + 1, high)
网友评论