快速排序详细讲解

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

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

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

快速排序(升序):

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

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

 

 

详细讲解:

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

定义一个临时变量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 }

 

posted @ 2019-08-21 01:00  孙晨c  阅读(530)  评论(0编辑  收藏  举报