A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wzixi 初级黑马   /  2017-10-27 23:30  /  1668 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

计算机排序算法主要分为内排序和外排序,内排序主要指数据存储在内存中的排序,外排序通常指待排序的数据量很大,而且大部分数据存储于文件中,排序时需要读写文件的排序。通常大家讨论的都是内排序,因为内排序是外排序的根基,通常外排序过程都程序要辅助内排序。

  最常见的内排序是冒泡排序,其时间复杂度为O(n^2), 空间复杂度为O(1),基本上属于就地排序,而且该算法具有稳定性,在数据量不大,而且顺序基本已经排列好的情况下,该算法应该被优先考虑,其实现代码如下:

冒泡排序(Bubble Sort)
  • //Data swop function
  • void Swap(int &p,int &q)
  • {
  •     p=p^q;
  •     q=p^q;
  •     p=p^q;
  • }
  • //Bubble sort
  • void BuubleSort(int ArrayInput[],int nNum)
  • {
  •     int i = 0, j=0;
  •     for( i=0; i<nNum-1; i++ )
  •     {
  •          for(j=0; j<nNum-i-1; j++)
  •          {
  •               if(ArrayInput[j] > ArrayInput[j+1])
  •               {
  •                   Swap( ArrayInput[j], ArrayInput[j+1] );
  •               }
  •          }
  •     }
  • }
  • int _tmain(int argc, _TCHAR* argv[])
  • {
  •     int nNum = 10;
  •     int ArrayInput[] = {2,3,1,4,8,8,9,7,6,5};
  •     BuubleSort(ArrayInput, nNum);
  •     for(int i=0; i<nNum; i++)
  •     {
  •          cout << ArrayInput << " ";
  •     }
  •     cout <<endl;
  •     return 0;
  • }





  另一个比较常用的内排序是快速排序,其平均时间复杂度为O(nlgn), 最坏时间复杂度为O(n^2), 该算法为不稳定排序算法,通常对大量数据进行排序时,时间优势还是比较明显的。
快速排序(Quick Sort)
N个元素被分成3组:left, right, pivot,其中Left<=pivot<=right,所以left和right可以分别排序,而且Quick Sort中可以省去对结果组合的步骤,代码如下:


  • //Data swop function
  • void Swap(int &p,int &q)                           
  • {                                                  
  •     p=p^q;
  •     q=p^q;     
  •     p=p^q;                                       
  • }  

  • //Partition function
  • int Partition(int ArrayInput[],int nLow,int nHigh)                 
  • {                                                  
  •     int i = 0, j=0, nTemp=0;                                                
  •     i=nLow;
  •     j=nHigh;                                 
  •     nTemp=ArrayInput;   

  •     do                                                
  •     {                                                
  •         //From right to left
  •         while((ArrayInput[j]>nTemp) && (i<j))                     
  •         j--;                                            
  •         if(i<j)                                          
  •         Swap(ArrayInput[i++],ArrayInput[j]);  

  •         //From left to right
  •         while((ArrayInput<=nTemp) && (i<j))                     
  •         i++;                                            
  •         if(i<j)                                          
  •         Swap(ArrayInput[j--],ArrayInput);            
  •     }while(i!=j);   

  •     ArrayInput=nTemp;                                       
  •     return i;                                         
  • }

  • //Quick sort
  • void Quick_sort(int ArrayInput[],int nLow,int nHigh)            
  • {                                                  
  •     int i = 0;                                                         
  •     if(nLow < nHigh)                                         
  •     {                                                
  •         i=Partition(ArrayInput , nLow, nHigh);                          
  •         Quick_sort(ArrayInput , nLow, i-1);                           
  •         Quick_sort(ArrayInput , i+1, nHigh);                           
  •     }                                                
  • }

  • int _tmain(int argc, _TCHAR* argv[])
  • {
  •     int ArrayInput[] = {2,3,1,4,8,8,9,7,6,5};                                      
  •     int i= 0;
  •     int nNum = 10;                                                   
  •                         
  •     Quick_sort(ArrayInput, 0, nNum-1);   
  •    
  •     for(i=0; i<nNum; i++)                                
  •     {
  •         cout<<ArrayInput<<" ";         
  •     }                       
  •     cout<<endl;   
  •     return 0;




1 个回复

倒序浏览
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马