之前关于快速排序一直比较模糊,网上有几种常见写法:

方法一:

 void quickSort(int s[], int l, int r)
{
if (l< r)
{
int i = l, j = r, x = s[l];
while (i < j)
{
while(i < j && s[j]>= x) // 从右向左找第一个小于x的数
j--;
if(i < j)
s[i++] = s[j];
while(i < j && s[i]< x) // 从左向右找第一个大于等于x的数
i++;
if(i < j)
s[j--] = s[i];
}
s[i] = x;
quickSort(s, l, i - ); // 递归调用
quickSort(s, i + , r);
}
}

方法二:

   void quicksort(point list[],int m,int n)
{
int key,i,j,k;
if( m < n)
{
k = choose_pivot(m,n);
if(m != k)
swap(list[m],list[k]);
key = list[m].len;
i = m+;
j = n;
while(i <= j)
{
while((i <= n) && (list[i].len <= key)) i++;
while((j >= m) && (list[j].len > key)) j--;
if( i < j)
swap(list[i],list[j]);
}
// 交换两个元素的位置
if(m != j)
swap(list[m],list[j]);
// 递归地对较小的数据序列进行排序
quicksort(list,m,j-);
quicksort(list,j+,n); } }

下面介绍如题的一种快速排序,大概思想是:(1)选取枢纽值是采用三数中值法 (2)当数据元素个数很小时,采用插入排序

 #define cutoff 5    //定义数值,当待排序的个数小于等于cutoff,采用插入排序

 void QuickSort( int A[], int N )//驱动例程
{
Qsort( A, , N- );
} /*
三数中值法,就是把左端,右端和中心位置的三个元素进行排序,然后将中心位置的主元换到倒数第二个位置。
返回主元的值
*/
int Median3( int A[], int left, int right)
{
int center; center = left + ( right - left ) / ; //数很大时,避免数据溢出 if( A[left] > A[center] )
swap(A[left],A[center]);//传递的是引用,直接用c++的库函数即可
if( A[left] > A[right] )
swap( A[left], A[right] ); if( A[center] > A[right] )
swap( A[center], A[right] ); swap( A[center], A[right-] ); return A[right-];
} /*
快速排序主例程
*/
void Qsort( int A[], int left, int right )
{
int i,j;
int Pivot
i = left;
j = right - ; if( left + cutoff <= right )
{
Pivot = Median3( A[], left, right );
for( ; ; )
{
while( A[++i] < Pivot ); while( A[--j] > Pivot ); if( i< j )
swap( A[i], A[j] );
else
break;
}
swap( A[right-], A[i] ); Qsort( A, left, i-);
Qsort( A, i+, right);
}
else
{
InsertionSort( A+left, right - left + );
} }

最新文章

  1. jgGrid中的editrules使用函数来进行验证
  2. 利用setns()将进程加入一个新的network namespace
  3. BUG处理方案设计
  4. hdu 1556
  5. Hibernate入门与简谈
  6. Azure 媒体服务可将优质内容传输至 Apple TV
  7. 20145334 《Java程序设计》第10周学习总结
  8. 译:在C#中使用LINQ To SQL
  9. Check list
  10. 12.组合(Composition)
  11. JavaScript系列文章:详解正则表达式之三
  12. Thinkphp5 设置日志
  13. HashSet,LinkedHashSet,TreeSet的区别
  14. Hi3531添加16GByte(128Gbit) NAND Flash支持
  15. iOS关于图片点到像素转换之杂谈
  16. 双十一福利,阿里云1核2G一年最低只要99
  17. crond守护进程实现定时监控某进程占有内存的大小
  18. C语言四舍五入
  19. C/C++基础----IO库
  20. day21 数据库(DataBase)

热门文章

  1. Python-pip更改国内源
  2. 通过实体类生成建表SQL语句实现方法
  3. HTML编码的用户输入------阻止向Controller的方法传入参数时用链接注入javascript代码或者HTML标记
  4. Java超简明入门学习笔记(二)
  5. Ionic 新闻类别菜单
  6. 实习面试总结(只写了昨天腾讯的面试和拿到offer的一个小公司, 有空再把前面的补上吧)
  7. 仓库盘点功能-ThinkPHP_学习随笔
  8. Android App的设计架构:MVC,MVP,MVVM与架构AAAAA
  9. java填坑记录
  10. python intern(字符串驻留机制)