/*
* 快速排序(C实现)
1.i =L; j = R; 将基准数挖出形成第一个坑a[i]。
2.j--由后向前找比它小的数,找到后挖出此数填前一个坑a[i]中。
3.i++由前向后找比它大的数,找到后也挖出此数填到前一个坑a[j]中。
4.再重复执行2,3二步,直到i==j,将基准数填入a[i]中。
*/
void quick_sort(int s[], int l, int r)
{
if (l < r)
{
int i = l, j = r, x = s[l];
// 1.用挖坑填数的方法,把小于x的数放在左边,把大于x的数放在右边,最后把x放在最后一个被遍历的位置
while (i < j)
{
while(i < j && s[j] >= x) // 从右向左找第一个小于x的数
j--;
if(i < j)
s[i++] = s[j];
while(i < j && s[i] < x) // 从左向右找第一个大于等于x的数
i++;
if(i < j)
s[j--] = s[i];
}
s[i] = x;
// 2.用分治法,分别对x左边的数组和x右边的数组进行排序
quick_sort(s, l, i - 1); // 递归调用
quick_sort(s, i + 1, r);
}
}
/*
* 快速排序(OC实现)
1.i =L; j = R; 将基准数挖出形成第一个坑a[i]。
2.j--由后向前找比它小的数,找到后挖出此数填前一个坑a[i]中。
3.i++由前向后找比它大的数,找到后也挖出此数填到前一个坑a[j]中。
4.再重复执行2,3二步,直到i==j,将基准数填入a[i]中。
*/
- (void)quickSort:(NSMutableArray *)arr start:(NSInteger)start end:(NSInteger)end {
if (!arr || arr.count <= 1 || start > end) {
return;
}
NSInteger i = start, j = end, X = [arr[start] integerValue];
while (i < j) {
while (i < j && [arr[j] integerValue] >= X) {
j--;
}
if (i < j) {
arr[i] = arr[j];
i++;
}
while (i < j && [arr[i] integerValue] < X) {
i++;
}
if (i < j) {
arr[j] = arr[i];
j--;
}
}
arr[i] = @(X);
[self quickSort:arr start:start end:i -1];
[self quickSort:arr start:i + 1 end:end];
}