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