当前位置:编程学习 > 网站相关 >>

10种排序算法总结

排序算法有很多,所以在特定情景中使用哪一种算法很重要。为了选择合适的算法,可以按照建议的顺序考虑以下标准: 
(1)执行时间 
(2)存储空间 
(3)编程工作 
   对于数据量较小的情形,(1)(2)差别不大,主要考虑(3);而对于数据量大的,(1)为首要。 
  
主要排序法有: 
一、冒泡(Bubble)排序——相邻交换 
二、选择排序——每次最小/大排在相应的位置 
三、插入排序——将下一个插入已排好的序列中 
四、壳(Shell)排序——缩小增量 
五、归并排序 
六、快速排序 
七、堆排序 
八、拓扑排序 
九、锦标赛排序 
十、基数排序 
  
  
 
一、冒泡(Bubble)排序 
 
----------------------------------Code 从小到大排序n个数------------------------------------ 
void BubbleSortArray() 
      for(int i=1;i<n;i++) 
      { 
        for(int j=0;i<n-i;j++) 
         { 
              if(a[j]>a[j+1])//比较交换相邻元素 
               { 
                   int temp; 
                   temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; 
               } 
         } 
      } 
-------------------------------------------------Code------------------------------------------------ 
效率 O(n²),适用于排序小列表。 
  
  
二、选择排序 
----------------------------------Code 从小到大排序n个数-------------------------------- 
void SelectSortArray() 
    int min_index; 
    for(int i=0;i<n-1;i++) 
    { 
         min_index=i; 
         for(int j=i+1;j<n;j++)//每次扫描选择最小项 
            if(arr[j]<arr[min_index])  min_index=j; 
         if(min_index!=i)//找到最小项交换,即将这一项移到列表中的正确位置 
         { 
             int temp; 
             temp=arr[i]; arr[i]=arr[min_index]; arr[min_index]=temp; 
-------------------------------------------------Code----------------------------------------- 
效率O(n²),适用于排序小的列表。 
  
  
三、插入排序 
--------------------------------------------Code 从小到大排序n个数------------------------------------- 
void InsertSortArray() 
for(int i=1;i<n;i++)//循环从第二个数组元素开始,因为arr[0]作为最初已排序部分 
    int temp=arr[i];//temp标记为未排序第一个元素 
    int j=i-1; 
while (j>=0 && arr[j]>temp)/*将temp与已排序元素从小到大比较,寻找temp应插入的位置*/ 
    arr[j+1]=arr[j]; 
    j--; 
arr[j+1]=temp; 
------------------------------Code-------------------------------------------------------------- 
最佳效率O(n);最糟效率O(n²)与冒泡、选择相同,适用于排序小列表 
若列表基本有序,则插入排序比冒泡、选择更有效率。 
  
  
四、壳(Shell)排序——缩小增量排序 
-------------------------------------Code 从小到大排序n个数------------------------------------- 
void ShellSortArray() 
  for(int incr=3;incr<0;incr--)//增量递减,以增量3,2,1为例 
       for(int L=0;L<(n-1)/incr;L++)//重复分成的每个子列表 
   for(int i=L+incr;i<n;i+=incr)//对每个子列表应用插入排序 
   { 
      int temp=arr[i]; 
      int j=i-incr; 
      while(j>=0&&arr[j]>temp) 
      { 
          arr[j+incr]=arr[j]; 
          j-=incr; 
arr[j+incr]=temp; 
--------------------------------------Code------------------------------------------- 
适用于排序小列表。 
效率估计O(nlog2^n)~O(n^1.5),取决于增量值的最初大小。建议使用质数作为增量值,因为如果增量值是2的幂,则在下一个通道中会再次比较相同的元素。 
壳(Shell)排序改进了插入排序,减少了比较的次数。是不稳定的排序,因为排序过程中元素可能会前后跳跃。 
  
  
五、归并排序 
----------------------------------------------Code 从小到大排序--------------------------------------- 
void MergeSort(int low,int high) 
   if(low>=high)   return;//每个子列表中剩下一个元素时停止 
   else int mid=(low+high)/2;/*将列表划分成相等的两个子列表,若有奇数个元素,则在左边子列表大于右侧子列表*/ 
   MergeSort(low,mid);//子列表进一步划分 
   MergeSort(mid+1,high); 
   int [] B=new int [high-low+1];//新建一个数组,用于存放归并的元素 
   for(int i=low,j=mid+1,k=low;i<=mid && j<=high;k++)/*两个子列表进行排序归并,直到两个子列表中的一个结束*/ 
   { 
       if (arr[i]<=arr[j];) 
    B[k]=arr[i]; 
    I++; 
else
    { B[k]=arr[j]; j++; } 
for(   ;j<=high;j++,k++)//如果第二个子列表中仍然有元素,则追加到新列表 
      B[k]=arr[j]; 
   for(   ;i<=mid;i++,k++)//如果在第一个子列表中仍然有元素,则追加到新列表中 
      B[k]=arr[i]; 
   for(int z=0;z<high-low+1;z++)//将排序的数组B的 所有元素复制到原始数组arr中 
      arr[z]=B[z]; 
-----------------------------------------------------Code--------------------------------------------------- 
效率O(nlogn),归并的最佳、平均和最糟用例效率之间没有差异。 
适用于排序大列表,基于分治法。 
  
六、快速排序 
------------------------------------Code-------------------------------------------- 
补充:综合编程 , 其他综合 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,