算法-快速排序

/*
 * 快速排序(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];
}
点赞