代码之家  ›  专栏  ›  技术社区  ›  falamiw

无左右索引跟踪的快速排序

  •  0
  • falamiw  · 技术社区  · 2 年前

    我需要实现快速排序算法,对动态分配内存的数组进行排序。我试着写一些代码:

    #include <stdio.h>
    // function to swap elements
    void swap(int *a, int *b) {
      int t = *a;
      *a = *b;
      *b = t;
    }
    // function to find the partition position
    int partition(int array[], int low, int high) {
      // select the rightmost element as pivot
      int pivot = array[high];
      // pointer for greater element
      int i = (low - 1);
      // traverse each element of the array
      // compare them with the pivot
      for (int j = low; j < high; j++) {
        if (array[j] <= pivot) {
          // if element smaller than pivot is found
          // swap it with the greater element pointed by i
          i++;
          // swap element at i with element at j
          swap(&array[i], &array[j]);
        }
      }
      // swap the pivot element with the greater element at i
      swap(&array[i + 1], &array[high]);
      // return the partition point
      return (i + 1);
    }
    void quickSort(int array[], int low, int high) {
      if (low < high) {
        // find the pivot element such that
        // elements smaller than pivot are on left of pivot
        // elements greater than pivot are on right of pivot
        int pi = partition(array, low, high);
        // recursive call on the left of pivot
        quickSort(array, low, pi - 1);
        // recursive call on the right of pivot
        quickSort(array, pi + 1, high);
      }
    }
    // function to print array elements
    void printArray(int array[], int size) {
      for (int i = 0; i < size; ++i) {
        printf("%d  ", array[i]);
      }
      printf("\n");
    }
    // main function
    int main() {
      size_t n = 8;
      int *x = malloc( n * sizeof( int ) );
      memcpy( x, ( int[] ){8, 7, 2, 1, 0, 9, 6,0}, n * sizeof( int ) ); // need <string.h>
      printf("Unsorted Array\n");
      printArray(x, n);
      // perform quick-sort on data
      quickSort(x, n);
      printf("Sorted array in ascending order: \n");
      printArray(x, n);
      free(x);
    }
    

    问题是,给出的指令是将函数编写为 quickSort(int* x, int n) 结构但我当时非常困惑,递归函数是如何知道左右索引的?

    另一个问题是,测试我的程序的最佳方法是什么?比如如何高效地创建测试用例。我是一名中级python开发人员,在使用C编程时面临很多问题。

    1 回复  |  直到 2 年前
        1
  •  1
  •   Yves Daoust    2 年前

    提示:

    经过 (array, low, high) 可以用传球代替 (array + low, high - low) ,并进行必要的调整。


    对于测试,填充一个递增值数组(可能不严格)。生成1、2、3、4或5个元素的所有排列,排序并与初始数组进行比较(这比只检查递增顺序要好,以防引入额外或重复的值!)。

    也可以尝试几个更大数量的元素的排列。

        2
  •  1
  •   Matt Timmermans    2 年前

    在C语言中,数组有其最简单的可能形式——在内存中连续排列的固定数量的对象。在一系列 int 例如,这些元素的地址是 sizeof(int) 字节间隔。

    当有人打电话时 quicksort(int *x, int n) , x 是指向第一个要排序的元素的指针,并且 n 是要排序的元素数。这 能够 可以是数组,但也可以是 部分 一个数组的。

    在C中,当你把1加到 int * ,它会更改指针指向的地址 sizeof(内部) 字节。这使您可以使用简单的数学来查找其他元素,并对输入数组的某些部分进行递归调用。

    例如:

    • 对前5个元素进行排序: quicksort(x,5)
    • 对最后5个元素进行排序: quicksort(x+n-5,5)
    • 获取第七元素 val = *(x+7); //equivalent to x[7]