五种常见排序就是:冒泡 插入 选择 快速排序 归并排序
排序和查找的关系:排序是查找的前提 排序是重点
在这里,快速排序,顾名思义,排序速度较快,但是较为复杂,但是递归这个思想,说简单但是也有些绕,说难也就几行代码的问题。
快速排序(升序):
先确定无序数组里的某一个元素在有序里的位置,这样就把数组分成两半无序数组
每一半也按照之前的方法……递归思想
详细讲解:
定义两个变量分别接收第一个元素和最后一个元素
定义一个临时变量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 }