Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 快速排序中的轴集_C_Sorting_Quicksort - Fatal编程技术网

C 快速排序中的轴集

C 快速排序中的轴集,c,sorting,quicksort,C,Sorting,Quicksort,为什么除了high之外,不同的pivot不适用于此代码?是否有可以处理高/低/随机枢轴的快速排序代码,或者它必须是一个单独的算法?我认为这是在使用 /*C实现快速排序*/ #包括 //交换两个元素的实用函数 无效交换(int*a,int*b) { int t=*a; *a=*b; *b=t; } /*此函数以最后一个元素为轴,放置 轴元素在其正确的位置排序 数组,并放置所有较小的(小于轴) 轴的左侧和所有较大元素的右侧 轴心*/ 整数分区(整数arr[],整数低,整数高) { int pivot

为什么除了high之外,不同的pivot不适用于此代码?是否有可以处理高/低/随机枢轴的快速排序代码,或者它必须是一个单独的算法?我认为这是在使用

/*C实现快速排序*/
#包括
//交换两个元素的实用函数
无效交换(int*a,int*b)
{
int t=*a;
*a=*b;
*b=t;
}
/*此函数以最后一个元素为轴,放置
轴元素在其正确的位置排序
数组,并放置所有较小的(小于轴)
轴的左侧和所有较大元素的右侧
轴心*/
整数分区(整数arr[],整数低,整数高)
{
int pivot=arr[high];//pivot
int i=(低-1);//较小元素的索引
对于(int j=低;j起始指数,
高-->结束索引*/
无效快速排序(整数arr[],整数低,整数高)
{
如果(低<高)
{
/*pi是分区索引,arr[p]现在是
在正确的地方*/
int pi=分区(arr、低、高);
//在之前分别对元素进行排序
//分区和分区后
快速排序(arr、低、pi-1);
快速排序(arr、pi+1、高);
}
}
/*函数打印数组*/
void printary(int arr[],int size)
{
int i;
对于(i=0;i
据我所见,您可以编写一个快速排序,使用第一个或最后一个索引作为轴心。要获得一个随机轴心,代码通常会随机选择一个条目,并将其与第一个或最后一个索引交换,然后成为轴心。您可以查看轴心选择算法的详细信息。@JonathanLe这当然是我过去编写它们的方式(我通常使用高端)。这很容易,因为如果在扫描过程中使用存储插槽,则轴心点被移动的可能性为零。但是,OP的代码看起来很奇怪,因为它在扫描过程中从未实际使用最终插槽进行存储,而是依赖于本地温度。最后一次交换看起来很奇怪(我没有测试过它)@WhozCraig如果由我决定的话,我会用这个算法完成它。但是我必须用低/高/兰德pivot来完成。我似乎不能用高pivot来完成它。即使是在我自己的基于维基百科伪代码的程序中。在使用低/高/兰德pivot的程序之间肯定有一些关键的区别是的,使用相同的基数组,但多个索引引用分区窗口时,索引变成了一种痛苦。用C和C++在递归的基地址上使用指针算法,将所有这些都抛出,使算法更容易实现和理解IMHO,至少对于C程序员来说是如此。
/* C implementation QuickSort */
#include <stdio.h>

// A utility function to swap two elements
void swap(int* a, int* b)
{
    int t = *a;
    *a = *b;
    *b = t;
}

/* This function takes last element as pivot, places
   the pivot element at its correct position in sorted
    array, and places all smaller (smaller than pivot)
   to left of pivot and all greater elements to right
   of pivot */
int partition (int arr[], int low, int high)
{
    int pivot = arr[high];    // pivot
    int i = (low - 1);  // Index of smaller element

    for (int j = low; j <= high- 1; j++)
    {
        // If current element is smaller than or
        // equal to pivot
        if (arr[j] <= pivot)
        {
            i++;    // increment index of smaller element
            swap(&arr[i], &arr[j]);
        }
    }
    swap(&arr[i + 1], &arr[high]);
    return (i + 1);
}

/* The main function that implements QuickSort
 arr[] --> Array to be sorted,
  low  --> Starting index,
  high  --> Ending index */
void quickSort(int arr[], int low, int high)
{
    if (low < high)
    {
        /* pi is partitioning index, arr[p] is now
           at right place */
        int pi = partition(arr, low, high);

        // Separately sort elements before
        // partition and after partition
        quickSort(arr, low, pi - 1);
        quickSort(arr, pi + 1, high);
    }
}

/* Function to print an array */
void printArray(int arr[], int size)
{
    int i;
    for (i=0; i < size; i++)
        printf("%d ", arr[i]);
    printf("\n");
}

// Driver program to test above functions
int main()
{
    int arr[] = {10, 7, 8, 9, 1, 5};
    int n = sizeof(arr)/sizeof(arr[0]);
    quickSort(arr, 0, n-1);
    printf("Sorted array: \n");
    printArray(arr, n);
    return 0;
}