103.png

    1. /*
    2. 编写一个算法,使之能够在数组中找到第k小的元素
    3. 分析:我们可以采用先排序的方式,但这样时间复杂度偏高;这里我们采用快速排序来进行思考,我们知道快速排序每一趟会确定一个元素的最终
    4. 位置,假设为m,
    5. 若m=k,那么此时便找到了第k小的元素
    6. 若m<k,说明第k小的元素还在m的右半部分,继续查找第k小元素
    7. 若m>k,说明第k小的元素在m的左半部分,继续查找第k小元素
    8. 该算法的平均时间复杂度为O(n)
    9. */
    10. #define _CRT_SECURE_NO_WARNINGS
    11. #include <stdio.h>
    12. //进行一次快速排序并返回枢纽位置
    13. int partition(int *arr, int low, int high) {
    14. int pivot = arr[low];
    15. while (low < high) {
    16. while (low < high && arr[high] >= pivot)--high;
    17. arr[low] = arr[high];
    18. while (low < high && arr[low] <= pivot)++low;
    19. arr[high] = arr[low];
    20. }
    21. arr[low] = pivot;
    22. return low;
    23. }
    24. //快速排序
    25. int quickSort(int *arr, int low, int high, int k) {
    26. if (low < high) {
    27. int pivotPos = partition(arr, low, high);
    28. if (pivotPos == k)return arr[pivotPos];
    29. if (pivotPos < k)return quickSort(arr, pivotPos + 1, high, k);
    30. if (pivotPos > k)return quickSort(arr, low, pivotPos - 1, k);
    31. }
    32. else if (low == high && low == k) {//区间内只有一个元素
    33. return arr[k];
    34. }
    35. }
    36. int main() {
    37. int arr[] = { 0,1,5,6,3,4,7,11,10 };//1 3 4 5 6 7 10 11
    38. int value;
    39. int k;
    40. printf("请输入要查找的数据:k=");
    41. scanf("%d", &k);
    42. getchar();
    43. value = quickSort(arr, 1, 8, k);
    44. printf("%d ", value);
    45. return 0;
    46. }