快排的c++实现(两种实现方式)

快排的c++实现(两种实现方式)

https://blog.csdn.net/jeryjeryjery/article/details/52894756

标签: 快速排序算法 C
 分类:
 
快速排序算法是现在用的最广的排序算法,也是效率最高的。它有两种实现方式,一种是定轴法,另外一种是挖坑法。这里简单介绍一下两种实现方法的思想,并附上C++实现代码。
(一)定轴法:

1.备份对轴(首记录)

2.取两个指针left和right,初始值分别是序列的第二个元素和最后一个元素,并且left<=right

3.移动两个指针

*从right所指的位置向左搜索,找到第一个小于轴的元素

*从left所指的位置向右搜索,找到第一个大于轴的元素

*找到后如果left<right,那么就交换两个位置的值

 

4.重复上述过程,知道left>right

5.把轴放到right的位置,并且将right位置的值放到第一位

6.分别将right位置左边的和右边的进行上述的递归

C++代码实现如下:

 

[cpp] view plain copy
 
  1. void quickSort(int* A,int first,int last){        //数组A,first是第一个元素下标,last是最后一个元素下标  
  2.     if(last<=first)                           //到了长度小于1这种情况已经是有序列了  
  3.         return;  
  4.   
  5.     int pivot=A[first];  
  6.     int left=first+1;                         //left等于第二个元素  
  7.     int right=last;      
  8.         int temp;  
  9.     while(left<=right){  
  10.         while(A[right]>pivot&&right>=left)//找到一个比first小的,但必须保证left值小于等于right值  
  11.             right--;  
  12.   
  13.         while(A[left]<pivot&&left<=right) //找到一个比first大的,但得保证left值小于等于right值  
  14.             left++;  
  15.   
  16.         if(left>=right)                   //说明已经是相对有序序列,无需交换  
  17.             break;  
  18.   
  19.         temp=A[left];                     //交换位置  
  20.         A[left]=A[right];  
  21.         A[right]=temp;  
  22.         left++,right--;                   //相应的进一位  
  23.     }  
  24.     A[first]=A[right];                        //因为right一定是停在从右到左第一个小于first的数上,交换之后,  
  25.                                            //依然能保证first值左边的比first小,右边的比first大  
  26.     A[right]=pivot;  
  27.   
  28.     quickSort(A,first,right-1);               //左半部分  
  29.     quickSort(A,left,last);                   //右半部分  
  30. }  

 

 

(二)挖坑法:

1.备份轴记录

2.取两个指针low和high,初始值就是序列的两端下标,保证low<=high

3.移动两个指针

*从high向左找到第一个小于轴的元素, 放在low的位置

*从low向右找到第一个大于轴的元素,放在high的位置

4.重复,直到low=high,

5.把轴放在low所指的位置

6.分别对low所指的位置的左边和右边进行上述的递归

C++实现代码如下:

 

[cpp] view plain copy
 
  1. void quickSort(int s[], int l, int r)  
  2. {  
  3.     if(l<r)  
  4.     {        
  5.         int low=l;                            //左边第一个,因为第一个已经用pivot保存了  
  6.     int high=r;                           //右边  
  7.     int pivot = s[l];                     //第一个,已被保存  
  8.         while(low<high)                       //当左小于右,当相等的时候会跳出循环  
  9.         {  
  10.             while(low<high&&s[high]>= pivot)  // 从右向左找第一个小于x的数  
  11.                 high--;   
  12.             if(low<high)                          
  13.                 s[low++] = s[high];  
  14.                       
  15.             while(low<high&&s[low]<pivot)     // 从左向右找第一个大于等于x的数  
  16.                 low++;   
  17.             if(low<high)    
  18.                 s[high--] = s[low];  
  19.         }  
  20.         s[low]=pivot;          
  21.         quickSort(s, l, low - 1);             //low左边递归调用  
  22.         quickSort(s, low + 1, r);             //low右边递归调用  
  23.     }  
  24. }  


 



posted @ 2018-04-02 14:58  sky20080101  阅读(352)  评论(0)    收藏  举报