题目:输入整数数组List及数组长度n,对其进行快速排序
来源:某500强企业面试题目
思路:可参考这里的Flash动画,非常清晰明了
复杂度:时间复杂度O(n log(n))
//----------------------------------------
// 实现快速排序
// 参考Flash动画 http://www.jcc.jx.cn/xinwen3/news/kj/flash/2004/0426/1306.htm
//----------------------------------------
int Partition(int List[], int L, int R){
int Pivot = List[L]; // 基准值取第一个
do{ // 反复循环
while(List[R] >= Pivot){ // 从后向前找第一个比基准值小的
R--; // 没找到就左移
if (L == R){ // 判断L和R是否重合,如果重合,则退出
List[L] = Pivot;
return L;
}
}
List[L] = List[R]; // 取出R指向的数字,放入L中
L++; // L右移
if (L == R){ // 判断L和R是否重合,如果重合,则退出
List[L] = Pivot;
return L;
}
while (List[L] <= Pivot){ // 从前向后找第一个比基准值大的
L++; // 没找到就右移
if (L == R){ // 判断L和R是否重合,如果重合,则退出
List[L] = Pivot;
return L;
}
}
List[R] = List[L]; // 取出L指向的数字,放入R中
R--; // R左移
if (L == R){ // 判断L和R是否重合,如果重合,则退出
List[L] = Pivot;
return L;
}
}while(true);
}
void QuickSortList(int List[], int L, int R){
if (L >= R) return;
int p = Partition(List, L, R);
QuickSortList(List, L, p - 1);
QuickSortList(List, p + 1, R);
}
void QuickSort(int List[], int n){
QuickSortList(List, 0, n-1);
}
//----------------------------------------
// 测试快速排序
//----------------------------------------
void TestQuickSort(void){
int List[] = {3,5,1,3,2,5,0,1,8,4,11,7};
int n = 12;
int i;
printf("Before: ");
for (i = 0; i< n - 1; i++) printf("%d, ", List[i]);
printf("%d\n", List[n-1]);
printf("After: ");
QuickSort(List, n);
for (i = 0; i< n - 1; i++) printf("%d, ", List[i]);
printf("%d\n", List[n-1]);
}