zoukankan      html  css  js  c++  java
  • 快速排序详细讲解

      五种常见排序就是:冒泡 插入 选择 快速排序 归并排序

      排序和查找的关系:排序是查找的前提 排序是重点

       在这里,快速排序,顾名思义,排序速度较快,但是较为复杂,但是递归这个思想,说简单但是也有些绕,说难也就几行代码的问题。

    快速排序(升序):

    先确定无序数组里的某一个元素在有序里的位置,这样就把数组分成两半无序数组

    每一半也按照之前的方法……递归思想

     

    详细讲解:

    定义两个变量分别接收第一个元素和最后一个元素

    定义一个临时变量val存放第一个元素的值

    定义两个指针l、h分别指向第一个元素地址和最后一个元素地址

      以下的操作中,每赋值完一次后,就停止指针的移动。交替移动指针。比如H指针的元素赋值给了L指向的元素,H指针就不动了,需要移动的是L指针。下次L指向的元素赋值给了H指向的元素,L指针就不动了,移动H指针。

    由于是升序,若H指向的元素比L指向的元素小(7<9),就把H指向的元素赋值给L指向的元素。此时L指向的元素是7

    若此时L指向的元素比val小(7<9),就继续往后移一位。

    此时L指向的元素比val小(0<9),继续后移一位

    此时L指向的元素比val小(8<9),继续后移一位

    此时L指向的元素比val大(10>9),为了把大的元素往后排,就把L指向的元素赋值给H指向的元素,此时H指向的元素是10

     

    此时H指向的元素比val大(10>9),往前面移一位

    此时H指向的元素比val大(13>9),往前面移一位

    此时H指向的元素比val小(2<9),为了把小的元素往前排,就把H指向元素赋值给L指向的元素,此时L指向的元素的2

     

    L指针继续之前的操作,最终L、H指向同一个元素地址,就是存放9的位置

     

     1 #include<stdio.h>
     2 
     3 void QuickSort(int * a,int low,int high);
     4 int Findpos(int * a,int low,int high);
     5 
     6 int main(){
     7     int a[6] = {2,1,0,5,4,3};
     8     int i;
     9     
    10     QuickSort(a,0,5);
    11     //第二个形参表示数组第一个元素下标,第三个形参表示数组最后一个元素下标
    12     //表示从头至尾的排序,可以修改形参区间,也就是排序区间
    13     
    14     for(i=0;i<6;i++){
    15         printf("%d ",a[i]);
    16     }
    17     
    18     return 0;
    19 }
    20 
    21 void QuickSort(int * a,int low,int high){
    22     int pos;
    23     
    24     if(low<high){
    25         pos = Findpos(a,low,high);//找到第一个元素的有序后的位置pos
    26         //从确定位置pos的元素左右分成两半
    27         QuickSort(a,low,pos-1);//从low到pos-1
    28         QuickSort(a,pos+1,high);//从pos+1到high       
    29     }
    30 }
    31 
    32 int Findpos(int * a,int low,int high){
    33     int val = a[low];
    34     
    35     while(low<high){
    36         
    37         while(low<high && a[high]>=val){
    38             high--;
    39          }
    40             a[low]=a[high];
    41             
    42          while(low<high && a[low]<val){
    43                 low++;
    44          }
    45                 a[high] = a[low];
    46     }//终止while循环后low==high
    47     
    48         a[low] = val;
    49         return low; //high也行   
    50 }
  • 相关阅读:
    对《软件工程》这门课的总结
    结对编程项目---四则运算
    PSP记录个人项目耗时情况
    代码复审
    是否需要有代码规范
    四则运算的实现(C++)重做
    四则运算器的实现
    学习进度总结
    通过阅读教材,所得的不懂的问题
    自我介绍
  • 原文地址:https://www.cnblogs.com/sunbr/p/11386491.html
Copyright © 2011-2022 走看看