学习算法(5)——快速排序

来源:互联网 发布:江苏域名备案 编辑:程序博客网 时间:2024/06/05 07:03

1. 前言

快速排序,很经典,无数的地方都提到。
代码,虽然看起来不多,但是理解起来,并不是很容易。
我花了很长时间,才弄明白。
下面的代码,最关键的地方,就是理解 i 和 j 的增长的意义。

关键核心理解

j   :   序号小到大,做数组轮询。

i   :    始终停留在比pivot大的数字的前一个坐标上。这个坐标之前的数字都小于pivot 或者 i=-1 。



2. 代码

/* C implementation QuickSort */#include<stdio.h>// A utility function to swap two elementsvoid 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 functionsint 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;}



----


0 0
原创粉丝点击