快速排序算法


#include <stdio.h> #include <stdlib.h> void swap(int *x,int *y) { int temp; temp = *x; *x = *y; *y = temp; } int choose_pivot(int i,int j ) { return((i+j) /2); } void quicksort(int list[],int m,int n) { int key,i,j,k; if( m < n) { k = choose_pivot(m,n); swap(&list[m],&list[k]); key = list[m]; i = m+1; j = n; while(i <= j) { while((i <= n) && (list[i] <= key)) i++; while((j >= m) && (list[j] > key)) j--; if( i < j) swap(&list[i],&list[j]); } // 交换两个元素的位置 swap(&list[m],&list[j]); // 递归地对较小的数据序列进行排序 quicksort(list,m,j-1); quicksort(list,j+1,n); } } void printlist(int list[],int n) { int i; for(i=0;i<n;i++) printf("%d ",list[i]); } void main() { const int MAX_ELEMENTS = 10; int list[MAX_ELEMENTS]; int i = 0; // 产生填充序列的随机数 for(i = 0; i < MAX_ELEMENTS; i++ ){ list[i] = rand(); } printf("进行排序之前的序列: "); printlist(list,MAX_ELEMENTS); // sort the list using quicksort quicksort(list,0,MAX_ELEMENTS-1); // print the result printf("使用快速排序算法进行排序之后的序列: "); printlist(list,MAX_ELEMENTS); }

转自    http://cprogramminglanguage.net/quicksort-algorithm-c-source-code.aspx

补充 

void QuickSort(double *mcvo_volt_value, int left, int right)
{
    if (left >= right)/*如果左边索引大于或者等于右边的索引就代表已经整理完成一个组了*/
    {
        return;
    }
    int i = left;
    int j = right;
    double key = mcvo_volt_value[left];
    while (i < j)                               /*控制在当组内寻找一遍*/
    {
        while (i < j && key <= mcvo_volt_value[j])
            /*而寻找结束的条件就是,1,找到一个小于或者大于key的数(大于或小于取决于你想升
            序还是降序)2,没有符合条件1的,并且i与j的大小没有反转*/
        {
            j--;/*向前寻找*/
        }
        mcvo_volt_value[i] = mcvo_volt_value[j];
        /*找到一个这样的数后就把它赋给前面的被拿走的i的值(如果第一次循环且key是
        a[left],那么就是给key)*/

        while (i < j && key >= mcvo_volt_value[i])
            /*这是i在当组内向前寻找,同上,不过注意与key的大小关系停止循环和上面相反,
            因为排序思想是把数往两边扔,所以左右两边的数大小与key的关系相反*/
        {
            i++;
        }
        mcvo_volt_value[j] = mcvo_volt_value[i];
    }
    mcvo_volt_value[i] = key;/*当在当组内找完一遍以后就把中间数key回归*/
    QuickSort(mcvo_volt_value, left, i - 1);/*最后用同样的方式对分出来的左边的小组进行同上的做法*/
    QuickSort(mcvo_volt_value, i + 1, right);/*用同样的方式对分出来的右边的小组进行同上的做法*/
                       /*当然最后可能会出现很多分左右,直到每一组的i = j 为止*/
}
原文地址:https://www.cnblogs.com/hjj-fighting/p/10341222.html