shiqi17

一、快速排序

快速排序可以理解为是对冒泡排序的一种改进,把一组数,按照初始选定的标杆(参照数),分别从两端开始排序,左端\'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; 
} 

分类:

技术点:

相关文章:

  • 2022-12-23
  • 2021-12-19
  • 2021-12-19
  • 2022-01-18
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-11-17
猜你喜欢
  • 2022-12-23
  • 2021-11-26
  • 2021-10-11
  • 2021-12-31
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案