【原创】快速排序

来源:互联网 发布:前段优化 编辑:程序博客网 时间:2024/05/22 12:20

        今天参加新浪微博的笔试,遇到了一道算法题,写出快速排序的源代码。好久没写排序的代码了,自己重新写了一份,与大家分享。

        在程序中,写了几个辅助函数,一个是用来初始化带排序数组的,一个是用来打印数组的。好了,废话不多说了,见代码:

首先定义一个头文件。

  1: //QuickSort.h 
  2: #include <iostream> 
  3: #include <ctime> 
  4: using namespace std; 
  5:  
  6: //生成随机数数组 
  7: void createArray(int data[],int length); 
  8: //划分规则区域 
  9: int partition(int data[],int low, int high); 
 10: //快速排序 
 11: void quickSort(int data[],int low, int high); 
 12: //打印数组 
 13: void print(int data[],int length); 
 14:  
 15: 

然后实现这些函数。

  1: //QuickSort.cpp 
  2: #include "QuickSort.h" 
  3:  
  4: void createArray(int data[],int length) 
  5: { 
  6:     srand(time(0)); 
  7:     for (int i=0;i<length;++i) 
  8:     { 
  9:         data[i]=rand()%length+1; 
 10:     } 
 11: } 
 12:  
 13: int partition(int data[],int low, int high) 
 14: { 
 15:     int temp=data[high]; 
 16:     while(low<high) 
 17:     { 
 18:         while(low<high&&data[low]<=temp)++low; 
 19:         data[high]=data[low]; 
 20:         while(low<high&&data[high]>=temp)--high; 
 21:         data[low]=data[high]; 
 22:     } 
 23:     data[low]=temp; 
 24:     return low; 
 25: } 
 26:  
 27: void quickSort(int data[],int low, int high) 
 28: { 
 29:     int middle=0; 
 30:     if (low<high) 
 31:     { 
 32:         middle=partition(data,low,high); 
 33:         if(middle!=0||middle!=1) 
 34:             quickSort(data,low,middle-1); 
 35:         if(middle!=high-1||middle!=high-2) 
 36:             quickSort(data,middle+1,high); 
 37:     } 
 38: } 
 39:  
 40: void print(int data[],int length) 
 41: { 
 42:     for (int i=0;i<length;++i) 
 43:     { 
 44:     cout<<data[i]<<" "; 
 45:     } 
 46:     cout<<endl; 
 47: }

最后在主函数中执行快速排序。

  1: //main.cpp 
  2: #include "QuickSort.h" 
  3:  
  4: int main() 
  5: { 
  6:     cout<<"Enter the length of the array:"; 
  7:     int length=0; 
  8:     cin>>length; 
  9:     int *data=new int[length]; 
 10:     createArray(data,length); 
 11:     print(data,length); 
 12:     quickSort(data,0, length-1); 
 13:     print(data,length); 
 14:     return 0; 
 15: } 
 16:  
 17: 

        在实现快速排序时,时间复杂度为O(nlogn),空间复杂度为O(1),因为只使用了一个临时变量temp。为了方便,这个快速排序是使用递归方法实现的。体到递归,我们就应该想到递归的弊端。因为使用递归会不断的函数信息压入栈中,而栈的空间是有限的,所有如果递归层数过大,函数会出现错误,所有最好还是用非递归方法实现快速排序。本算法的另一个优化方法是如何更好地确定关键哨兵的位置。上面的方法是每次使用对应空间的最右端的值作为哨兵,但是这样出现问题,就是我的运气很差,每次选择的哨兵不是最小值,就是最大值。所以如果能在选择哨兵上优化一下,算法还是可以更优的运行。

        好了,今天先写到这吧,如果有问题,欢迎指正。

0 0
原创粉丝点击