C 实现快速排序

一、快速排序

快速排序可以理解为是对冒泡排序的一种改进,把一组数,按照初始选定的标杆(参照数),分别从两端开始排序,左端'i'只要小于标杆(参照数)的数,右端'j'只要大于标杆(参照数)的数,
i----->middle<-----j每一次排序循环条件为 i != j 左端I不等于j,每次排序,j先排,从右往左找,知道找到第一个比标杆(参照数)小的数就停下来,而i从左往右,除了找到比自己大的数停下来之外,还要满足i<j的条件。当i和j都停下来时,我们就交换索引i处的值和索引j处的值,如果 i != j 就继续从当前j往左边排序找到比标杆(参照值)小的数,i继续从当前位置向右找比自己大的数,这样循环直到 i == j 意味着,当前i、j索引的值,除了参照值左边都比标杆(参照数)小,右边都比参照数大,然后第一次排序把标杆和i处的值交换,就算完成了,然后把该数组分成了两段,分别再递归调用自身继续排序,直到每轮剩下两个数或者j先找,走到了i的位置,所以递归调用停止的条件就应该是 i>j-1。

二、C语言实现

include<stdio.h>

int arr_num[];
int length;

void quick_sort(int left, int right)
{
    int i, j, c, temp;
    if(left>right)
        return;
    
    i= left;
    j= right;
    temp = arr_num[i]    

    while(i != j)
    {
        while(arr_num[j]>=temp && i<j)
        {
            j--;
        }
        
        while(arr_num[i]<=temp && i<j)
        {
            i++;
        }

        if(i<j)
        {
            c = arr_num[i];
            arr_num[i] = arr_num[j];
            arr_num[j] = c;
        }
    }
    
    //left为起始值(参照值)此时的I为第一次排序结束的最后值,与参照值交换位置
    arr_num[left] = arr_num[i];
    arr_num[i] = temp;

    //继续递归直到排序完成
    quick_sort(left, i-1);
    quick_sort(i+1, right);
}

int main() 
{ 
    int i;
    length = 7;
    arr_num[length] = {23, 7, 17, 36, 3, 61, 49}
 
    //快速排序调用
    quick_sort(0, length-1);  
                             
    //输出排序后的结果 
    for(i=1;i<=length;i++) 
        printf("%d ",arr_num[i]); 
    getchar();getchar(); 
    return 0; 
} 
原文地址:https://www.cnblogs.com/shiqi17/p/9398893.html