c语言实现快排
课本上的讲法是选取第一个作为key值,然后i,j从第二个和最后一个开始,当找到a[i]>key和a[j]<key时就将他们交换,最终效果如下。但这样后面要把key值恢复到中间又得进行n/2次的搬移,感觉有些麻烦。
于是发现了csdn上前辈的解法链接使用“挖坑法”+“二分法”解决,挺巧妙的,细节也处理的很好。
void quickSort(int a[],int left,int right) {
if (left > right)
return;
int key;
int index = 0;
if (a[left] > a[right] && a[left] < a[(left + right) / 2] || a[left]<a[right] && a[left] > a[(left + right) / 2]) {
key = a[left];
index = left;
}
else if (a[right] > a[left] && a[right] < a[(left + right) / 2] || a[right]<a[left] && a[right] > a[(left + right) / 2]) {
key = a[right];
index = right;
}
else {
key = a[(left + right) / 2];
index = (left + right) / 2;
}
int temp = a[left];
a[left] = a[index];
a[index] = temp;
int i = left, j = right;
while (i < j) {
while (i<j&&a[j]>key) { j--; }
if (i < j) {
a[i++] = a[j];
}
while (i < j&&a[i] < key) { i++; }
if (i < j) {
a[j--] = a[i];
}
}
a[i] = key;
quickSort(a, left, i - 1);
quickSort(a, i + 1, right);
}