quick_sort.c 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. // quick sort implementation
  2. #include <stdio.h>
  3. void swap(int* x, int* y){
  4. int temp = *x;
  5. *x = *y;
  6. *y = temp;
  7. }
  8. /* 把高位元素作为基准值,找到一个位置,把基准值放到这个位置,
  9. 使得比基准值小的数放到左边;比基准值大的数字放到右边; 返回这个位置 */
  10. int partition (int arr[], int low, int high){
  11. int pivot = arr[high]; // pivot 基准值
  12. // 位置 i 左侧的元素都比基准值小,最后把 pivot 移动到 i+1的位置
  13. int i = (low - 1);
  14. for (int j = low; j <= high - 1; j++){
  15. // 找到一个比基准值小的值,索引往前加 1;
  16. // 如果 arr[j] > pivot,则不操作,
  17. // 此时 i 值即为当前 j 的位置,j的指针继续右移,
  18. // 等到找到右侧的小值跟 j 互换
  19. if (arr[j] < pivot){
  20. i++; // i+1,留一个位置存储这个小值, j 跟 i 互换:
  21. swap(&arr[i], &arr[j]);
  22. }
  23. }
  24. swap(&arr[i + 1], &arr[high]); // pivot 移动到 i+1 位置
  25. return (i + 1);
  26. }
  27. void printArray(int arr[], int size){
  28. for (int i = 0; i < size; i++)
  29. printf("%d ", arr[i]);
  30. printf("\n");
  31. }
  32. /* arr[] --> 待排序数组,
  33. low --> 起始位置,
  34. high --> 结束位置 */
  35. void quickSort(int arr[], int low, int high){
  36. if (low >= high)
  37. return;
  38. /* pi 是分割位置, 将基准点移动到 pi 点,
  39. 使得 pi 左边的数比基准点小,右边的数比基准点大 */
  40. int pi = partition(arr, low, high);
  41. // 分别排序左右两个分区的元素
  42. quickSort(arr, low, pi - 1);
  43. quickSort(arr, pi + 1, high);
  44. }
  45. int main(){
  46. int arr[] = {5, 9, 10, 3, 4, 7};
  47. int n = sizeof(arr) / sizeof(arr[0]);
  48. quickSort(arr, 0, n - 1);
  49. printf("Sorted array: ");
  50. printArray(arr, n);
  51. return 0;
  52. }