基本思想:
将当前待排序列分成两个部分、一个值。一个值:就是选定出一个值作为被比较的元素(基准数)。两个部分:所有比该被选定元素大的部分都去该元素的右边,所有比被选定元素小的部分都去该元素的左边。这样我们就确定了该元素在这个待排序列中的位置,其实也就是我们已经将这个元素“排好了”。
举例:
快速排序的每一轮处理其实就是将着一轮的基准数归位,直到所有的数都归位为止,排序就结束了。
算法实现:
int main(int argc, const char * argv[]) {
@autoreleasepool {
for (int i = 0; i < 10; ++i) {
scanf("%d", &number[i]);
}
quickSort(0, 9);
for (int i = 0; i < 10; ++i) {
printf("%d\t", number[i]);
}
}
return 0;
}
//**【快速排序】**//
int number[10];
void quickSort(int left, int right) {
if (left >= right) {
return;
}
int temp = number[left];//基数
int i = left;
int j = right;
while (i != j) {
//从右向左走
while (number[j] >= temp && i < j) {
j--;
}
//从左向右走
while (number[i] <= temp && i < j) {
i++;
}
if (i < j) {//把大数换到右边,把小数换到左边
int t = number[i];
number[i] = number[j];
number[j] = t;
}
}
//交换基数
number[left] = number[i];
number[i] = temp;
quickSort(left, i-1);//左侧递归
quickSort(j+1, right);//右侧递归
return;
}
参考啊哈磊的《啊哈!算法》一书。