插入排序和快速排序的优化——编程珠玑

来源:互联网 发布:三级便民服务网络体系 编辑:程序博客网 时间:2024/06/03 09:21
插入排序和快速排序的优化——编程珠玑
1.插入排序
方法一:

#include <algorithm>

[html] view plaincopy
  1. for(int i=1;i<5;i++)  
  2. j=i;j>0&&a[j-1]>a[j];j--)                         
  3.           swap(a[j-1],a[j]);  
方法二:代替库函数
[html] view plaincopy
  1. int temp;  
  2. for(int i=1;i<5;i++)   
  3.     for(int j=i; j>0 && a[j-1]>a[j]; j--)  
  4.        {  
  5.                   temp=a[j];  
  6.                   a[j]=a[j-1];  
  7.                   a[j-1]=temp;            
  8.             }  
方法三:减少移动次数
  1. for(i=1;i<5;i++)  
  2. {  
  3.     t=a[i];  
  4.     for(j=i; j>0 && a[j-1]>t; j--)  
  5.                   a[j]=a[j-1];                      
  6.        a[j]=t;                        
  7. }  

2.快速排序
方法一:O(nlog(n)时间和O(logn)的栈空间
  1. #include"stdio.h"  
  2. void  Partition(int a[],int left,int right)  
  3. {  
  4.     int i=left,j=right;  
  5.     int temp=a[i];//记录下轴的位置   
  6.       
  7.     if(left>=right)//退出条件  
  8.         return;  
  9.       
  10.     while(i<j)  
  11.     {  
  12.         while(i<j&&temp<=a[j])//从右侧查找,找到第一个比轴小的   
  13.            j--;  
  14.        
  15.                 a[i]=a[j];//小的 等于后面的大的 (之后的i 会增加)【后面的大的 移动到前面来后 本趟不会再动】   
  16.          
  17.             
  18.                 while(i<j&&temp>=a[i])//从左侧查找,找到第一个比轴大的    
  19.                        i++;  
  20.           
  21.                 a[j]=a[i]; // 大的后移  
  22.           
  23.         
  24.     }  
  25.     a[i]=temp;//找到轴的正确位置  
  26.       
  27.     Partition(a,left,j-1);  
  28.     Partition(a,j+1,right);       
  29. }  
  30. int main()  
  31. {  
  32.     int a[10]={3,4,2,1,6,5,7,8};      
  33.     Partition(a,0,7);     
  34.     for(int i=0;i<8;i++)  
  35.             printf("%d\n",a[i]);  
  36.         
  37.     return 0;  
  38. }  

方法二::双向划分避免所有元素都相等时候的最坏情况
  1. #include <iostream>  
  2. #include <algorithm>  
  3. using namespace std;  
  4. void quictSort(int a[],int l,int u)  
  5. {  
  6.     if(l >= u)  
  7.         return;  
  8.     int t = a[l];//记录轴  
  9.     int i = l;  
  10.     int j = u+1;  
  11.     for(;;)  
  12.     {  
  13.         do i++;while(i <= u && a[i] < t);//先i++再判断条件  
  14.         do j--;while(a[j] > t);          //先j--再判断条件  
  15.         if(i > j) //无限循环退出的条件  
  16.             break;  
  17.         swap(a[i],a[j]);//每找到一个前面元素大于等于轴,跟后面小于等于轴的就交换  
  18.     }  
  19.     swap(a[l],a[j]);  
  20.     quictSort(a,l,j-1);  
  21.     quictSort(a,j+1,u);  
  22. }  
  23. int main()  
  24. {     
  25.     int a[10]={3,4,2,1,6,5,7,8};      
  26.     quictSort(a,0,7);     
  27.     for(int i=0;i<8;i++)  
  28.             printf("%d\n",a[i]);  
  29.     return 0;  
  30. }  
方法三:
利用随机位置的数做轴,会使数组的快速排序得到优化。
  1. #include <iostream>  
  2. #include <algorithm>  
  3. using namespace std;  
  4. void quictSort(int a[],int l,int u)  
  5. {  
  6.     if(l >= u)  
  7.         return;  
  8.     swap(a[l],a[rand()%(u-l) + l]);//仅仅是在这里做文章  
  9.       
  10.     int t = a[l];  
  11.     int i = l;  
  12.     int j = u+1;  
  13.     for(;;)  
  14.     {  
  15.         do i++;while(i <= u && a[i] < t);  
  16.         do j--;while(a[j] > t);  
  17.         if(i > j)  
  18.             break;  
  19.         swap(a[i],a[j]);  
  20.     }  
  21.     swap(a[l],a[j]);  
  22.     quictSort(a,l,j-1);  
  23.     quictSort(a,j+1,u);  
  24. }  
  25. int main()  
  26. {     
  27.     int a[10]={3,4,2,1,6,5,7,8};      
  28.     quictSort(a,0,7);     
  29.     for(int i=0;i<8;i++)  
  30.       printf("%d\n",a[i]);  
  31.     return 0;  
  32. }  
参考文献:
     1.《编程珠玑》
     2.http://blog.csdn.net/tianshuai11/article/details/7577624
原创粉丝点击