正文

[原]自己总结的排序算法2007-12-20 10:13:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/sword2008/31508.html

分享到:

1,快速排序 这个有点难解释,感觉上就是纽来纽去,先从首记录开始也行,从未记录开始也行,以后补上. Tony Hoare在1962年首次提出了快速排序算法。对快速排序方法的研究表明,至今快速排序算法仍然是流传久远的最实用的排序算法。只在输入数据项有更详细的信息时,其它排序算法才可能胜过快速排序算法。快速排序算法是利用分治技术的典型例子,随机分治策略是设计组合优化与计算几何一类问题有效算法的基础。分治策略分为三步:   (1)将问题分成若干大小基本相等的子问题;  (2)独立地解决这些子问题;  (3)将子问题归并成原问题的解。  快速排序的基本思路是:首先我们选择一个中间值middle(程序中我们可使用数组中间值),把比中间值小的放在其左边,比中间值大的放在其右边。由于这个排序算法较复杂,我们先给出其进行一次排序的程序框架(从各类数据结构教材中可得): void QuickSort(int *pData, int left, int right){  int i, j;  int middle, iTemp;  i = left;  j = right;  middle = pData[(left + right) / 2]; //求中间值  do  {   while ((pData[i] < middle) && (i < right)) //从左扫描大于中值的数    i++;   while ((pData[j] > middle) && (j > left)) //从右扫描小于中值的数    j--;   if (i <= j) //找到了一对值   {    //交换    iTemp = pData[i];    pData[i] = pData[j];    pData[j] = iTemp;    i++;    j--;   }  } while (i <= j) ; //如果两边扫描的下标交错,就停止(完成一次)  //当左边部分有值(left<j),递归左半边  if(left<j)    QuickSort (pData,left,j);    //当右边部分有值(right>i),递归右半边  if(right>i)    QuickSort (pData,i,right); }   由此可见,上述排序算法中采用了递归策略。  在我设定的一个10000个无序记录集中,快速排序比冒炮节省了差不多一半时间,估计记录越多,这个数量级会更高. 2,选择排序, 选择排序和冒泡如果不仔细看,光从字面解释,很多人都弄混,解释这个很简单,举个例子就行. 如:2,6,1,4 首先将2和所有记录遍历,找出比他小的交换位置,于是(第一个记录) 1,6,2,4 第二次 将6遍历,找出小的交换(第二个记录) 1,2,6,4 第三次...... 1,2,4,6完成!   3,冒泡 这个就更加简单理解 两两相互之间比较,大(或者小的)放到前面,但必须遍历N-1次. 感觉上如果是无序的记录让他遍历效率会高. 如,2,6,1,4 2,1,4,6(小的交换后继续和后面的记录交换) 1,2,4,6完成``````(N-1次???好象是说选择排序了,忘记了.) 数据量少的时候可以用冒泡,某些人说过冒泡效率最低``````` 当然还有改良的冒泡双琏算法. void CTestDlg::BubbleSort(int *pData,int iNum)  //冒泡{ int i,j; int temp; for(i=iNum-1;i>0;i--)  //iNum-1次  for(j=0;j<i;j++)  {   if(pData[j]>pData[j+1])   {    temp  =pData[j];    pData[j] =pData[j+1];    pData[j+1] =temp;   }  }} 4插入排序 将第一个记录看成已经排好的序列,其次数据一个一个与之前最大的记录比较,子成序列,听说是如果有序的记录集合排序效果好. void CTestDlg::insert_sort(int * list, int length){        int i, j, temp;        for(i = 1; i < length; i ++)        {                temp = list[i];                j = i - 1;                while((list[j] > temp)&&(j >= 0))                {                        list[j+1] = list[j];                        j --;                }                list[j+1] = temp;            //    show_list(list, length);        }}

阅读(6779) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册