快速排序时间复杂度为O(nlogn)
,是数组相关的题目当中经常会用到的算法。
将数组传入函数
在C语言中,数组作为参数传递时会转换为指向数组起始地址的指针,非数组形式的数据实参均以传值形式调用。
下列两种形式的传参时等价的,他们均指向数组a的初始地址。
void test(int a[]);
void test(int *a);
因此test中的实际上是一个指针,对a[i]
进行操作就是对*(a + i)
操作。
由于test中的a是一个指针,因此若在test中调用数组a,应当直接调用,而不是&a
。&a
实质上是指向数组a的指针的地址,调用它进行操作会出错。
错误示范:
void test(int *a){
语句;
...
test11(&a); //假设test11已定义
...
语句;
}
在main函数中调用test时,test11无法执行,因为传入它的参数是指向数组a的指针的地址。
正确调用方式:
void test(int *a){
语句;
...
test11(a); //假设test11已定义
...
语句;
}
了解上述知识点后,开始写快速排序函数。
快速排序函数:
void quickSort(int *a, int left, int right) {
if ((a == NULL) || (left < 0) || (right < 0) || (left >= right))
return;
int i = left;
int j = right;
int base = a[left];
while (i < j) {
while ((i < j) && (a[j] > base))
j--;
if (i < j)
{
a[i] = a[j];
i++;
}
while ((i < j) && (a[i] < base))
i++;
if (i < j)
{
a[j] = a[i];
j--;
}
}
a[i] = base;
quickSort(a, left, i - 1);
quickSort(a, i + 1, right);
}
主函数:
int main() {
int a[] = {4, 9, 5, 1, 2, 7, 4, 8};
int len = sizeof(a) / sizeof(int);
for (int i = 0; i < len; i++) {
printf("%d ", a[i]);
}
printf("\n");
quickSort(&a,0,len - 1);
for (int i = 0; i < len; i++) {
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
运行结果:
快速排序是一种不稳定算法,因此数组当中的两个4的相对位置发生了变化。