题目:输入整数数组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]); }