标签:
排序算法包括很多种,其中快速排序是其中一种比较快的排序算法,今天就来介绍一下:
快速排序的基本实现思想就是将当前待排序列分成两个部分、一个值。一个值:就是选定出一个值作为被比较的元素。两个部分:所有比该被选定元素大的部分都去该元素的右边,所有比被选定元素小的部分都去该元素的左边。这样我们就确定了该元素在这个待排序列中的位置,其实也就是我们已经将这个元素“排好了”。
那么,怎么才能完成一次的快速排序呢?
我们选定一个被比较的元素,一般都是选第一个,即数组中第一个元素作为val,然后我们给出两个指针,一个指向最左边的元素,我们叫做low,一个指向最右边的元素,我们叫做hight,即如下图所示:
一次快速排序就是有hight开始比较,因为我们是升序排列,所以,当hight指向的元素比val大的时候,hight所指向的元素的位置相对于val不应该发生改变,然后hight-1,即我们hight的位置向左移动一位,然后在比较hight元素和val,直到找到一个hight元素比val小,我们就将hight所指向的元素赋给low所指向的元素,记住,此时hight不动。然后我们去移动low元素,当low元素比val小的时候,low元素的位置相对于val不应该发生改变(当前为升序排列,小的就应该在左边),然后low+1,即low的位置向右移动一位,然后在继续比较low元素和val,直到找到一个low元素比val大,我们就将low所指向的元素赋给hight位置,记住,此时low不动,然后去移动hight元素,以此类推,直到low和hight的位置重合,即我们当前已经没有任何没有比较过的元素,即此位置就是val应该在的位置。一次快速排序结束。如下图所示:
一次快速排序完成后,我们只是找到了第一个元素的位置,所以我们采用递归的方法将左边的元素和右边的元素都采用快速排序进行对被选定元素的位置排序,直到整个序列只剩下一个元素,我们的快速排序就完成了。
下面给出c语言实现的代码,直接看注释就好了,所有的解释都写在注释上了:
1 #include <stdio.h> 2 3 /* 4 @http://www.cnblogs.com/WuNaiHuaLuo/ 5 */ 6 7 void quicksort(int *arr,int low,int hight); 8 int findPos(int *arr,int low,int hight); 9 10 int main(int argc, char *argv[]) 11 { 12 int arr[5]={2,1,3,78,53}; 13 quicksort(arr,0,4); //0表示从数组0位置开始,到4位置排序 14 int i; 15 for(i=0;i<5;++i){ 16 printf("%d ",arr[i]); 17 } 18 19 20 21 return 0; 22 } 23 24 /* 25 快速排序算法 26 */ 27 void quicksort(int *arr,int low,int hight){ //快速排序算法的实质就是当前分为两半,分别给这两半进行快速排序,直到low==hight的时候 28 int pos; 29 if(low<hight){ 30 pos=findPos(arr,low,hight); //先对整体进行一次快速排序,将其分成两半 31 quicksort(arr,low,pos-1); //然后分别对pos位置左边的部分在进行快速排序,位置右边的部分进行快速排序 32 quicksort(arr,pos+1,hight); 33 } 34 } 35 36 int findPos(int *arr,int low,int hight){ 37 int val=arr[low]; 38 while(low<hight){ //再一次快速排序中只要low的值比hight小,我们就应该去移动,因为当前这次排序还没有完成 39 while(low<hight&&arr[hight]>=val){ //表示只有当前指针没有重合并且当前右边hight指向的值大于val时,才会向左移动hight 40 hight=hight-1; 41 } 42 arr[low]=arr[hight]; //将比val小的值赋到low 43 while(low<hight&&arr[low]<=val){ 44 low=low+1; 45 } 46 arr[hight]=arr[low]; //将比val大的值赋到hight上 47 } 48 arr[low]=val; //找到了所属的位置,并且将我们选定的值val赋到这个位置上去 49 return hight; 50 }
以上就是数据结构中快速排序的原理和代码实现,这只是我自己的学习理解,欢迎大家对其中不对的地方进行指正。
该博文属博主原创,转载请标明出处。
标签:
原文地址:http://www.cnblogs.com/WuNaiHuaLuo/p/5384995.html