10種類のソートアルゴリズムのまとめ(バブル、選択、挿入、ヒル、集計、高速、スタック、トポロジー、選手権、基数)



  
  
  
  
  1. , 。 , :  
  2. (1)  
  3. (2)  
  4. (3)  
  5.     ,(1)(2) , (3); ,(1) 。  
  6.    
  7. :  
  8. 、 (Bubble) ——  
  9. 、 —— /  
  10. 、 ——  
  11. 、 (Shell) ——  
  12. 、  
  13. 、  
  14. 、  
  15. 、  
  16. 、  
  17. 、  
  18.    
  19.    
  20.  
  21. 、 (Bubble)  
  22.  
  23. ----------------------------------Code  n ------------------------------------  
  24. void BubbleSortArray()  
  25. {  
  26.       for(int i=1;i<n;i++)  
  27.       {  
  28.         for(int j=0;i<n-i;j++)  
  29.          {  
  30.               if(a[j]>a[j+1])//  
  31.                {  
  32.                    int temp;  
  33.                    temp=a[j]; a[j]=a[j+1]; a[j+1]=temp;  
  34.                }  
  35.          }  
  36.       }  
  37. }  
  38. -------------------------------------------------Code------------------------------------------------  
  39.  O(n²), 。  
  40.    
  41.    
  42. 、  
  43. ----------------------------------Code  n --------------------------------  
  44. void SelectSortArray()  
  45. {  
  46.     int min_index;  
  47.     for(int i=0;i<n-1;i++)  
  48.     {  
  49.          min_index=i;  
  50.          for(int j=i+1;j<n;j++)//  
  51.             if(arr[j]<arr[min_index])  min_index=j;  
  52.          if(min_index!=i)// ,  
  53.          {  
  54.              int temp;  
  55.              temp=arr[i]; arr[i]=arr[min_index]; arr[min_index]=temp;  
  56. }  
  57. }  
  58. }  
  59. -------------------------------------------------Code-----------------------------------------  
  60. O(n²), 。  
  61.    
  62.    
  63. 、  
  64. --------------------------------------------Code  n -------------------------------------  
  65. void InsertSortArray()  
  66. {  
  67. for(int i=1;i<n;i++)// , arr[0]  
  68. {  
  69.     int temp=arr[i];//temp  
  70.     int j=i-1;  
  71. while (j>=0 && arr[j]>temp)/* temptemp */  
  72. {  
  73.     arr[j+1]=arr[j];  
  74.     j--;  
  75. }  
  76. arr[j+1]=temp;  
  77. }  
  78. }  
  79. ------------------------------Code--------------------------------------------------------------  
  80. O(n); O(n²) 、 ,  
  81. , 、 。  
  82.    
  83.    
  84. 、 (Shell) ——  
  85. -------------------------------------Code  n -------------------------------------  
  86. void ShellSortArray()  
  87. {  
  88.   for(int incr=3;incr<0;incr--)// , 3,2,1  
  89. {  
  90.        for(int L=0;L<(n-1)/incr;L++)//  
  91. {  
  92.    for(int i=L+incr;i<n;i+=incr)//  
  93.    {  
  94.       int temp=arr[i];  
  95.       int j=i-incr;  
  96.       while(j>=0&&arr[j]>temp)  
  97.       {  
  98.           arr[j+incr]=arr[j];  
  99.           j-=incr;  
  100. }  
  101. arr[j+incr]=temp;  
  102. }  
  103. }  
  104. }  
  105. }  
  106. --------------------------------------Code-------------------------------------------  
  107. 。  
  108. O(nlog2^n)~O(n^1.5), 。 , 2 , 。  
  109. (Shell) , 。 , 。  
  110.    
  111.    
  112. 、  
  113. ----------------------------------------------Code  ---------------------------------------  
  114. void MergeSort(int low,int high)  
  115. {  
  116.    if(low>=high)   return;//  
  117.    else int mid=(low+high)/2;/* , , */  
  118.    MergeSort(low,mid);//  
  119.    MergeSort(mid+1,high);  
  120.    int [] B=new int [high-low+1];// ,  
  121.    for(int i=low,j=mid+1,k=low;i<=mid && j<=high;k++)/* , */  
  122.    {  
  123.        if (arr[i]<=arr[j];)  
  124. {  
  125.     B[k]=arr[i];  
  126.     I++;  
  127. }  
  128. else 
  129.     { B[k]=arr[j]; j++; }  
  130. }  
  131. for(   ;j<=high;j++,k++)// ,  
  132.       B[k]=arr[j];  
  133.    for(   ;i<=mid;i++,k++)// ,  
  134.       B[k]=arr[i];  
  135.    for(int z=0;z<high-low+1;z++)// B   arr  
  136.       arr[z]=B[z];  
  137. }  
  138. -----------------------------------------------------Code---------------------------------------------------  
  139. O(nlogn), 、 。  
  140. , 。  
  141.    
  142. 、  
  143. ------------------------------------Code--------------------------------------------  
  144. /* : , , , , 。*/                  void swap(int a,int b){int t;t =a ;a =b ;b =t ;}  
  145.         int Partition(int [] arr,int low,int high)  
  146.         {  
  147.             int pivot=arr[low];//  
  148.             while (low < high)  
  149.             {  
  150.                 //  
  151.                 while (low < high && arr[high] >= pivot)  
  152.                 {  
  153.                     --high;  
  154.                 }  
  155.                 //  
  156.                 swap(arr[low], arr[high]);  
  157.                 //  
  158.                 while (low <high &&arr [low ]<=pivot )  
  159.                 {  
  160.                     ++low ;  
  161.                 }  
  162.                 swap (arr [low ],arr [high ]);//  
  163.             }  
  164.             return low ;//  
  165.         }  
  166.         void QuickSort(int [] a,int low,int high)  
  167.         {  
  168.             if (low <high )  
  169.             {  
  170.                 int n=Partition (a ,low ,high );  
  171.                 QuickSort (a ,low ,n );  
  172.                 QuickSort (a ,n +1,high );  
  173.             }  
  174.         }  
  175. ----------------------------------------Code-------------------------------------  
  176. O(nlogn), 。  
  177. ; , O(n²) 。 , 。 , O(nlogn)。  
  178. 。  
  179.    
  180.    
  181.  
  182. 、  
  183. : 、 , 。  
  184. :  
  185. (1) i=l, temp= kl ;  
  186. (2) i j=2i+1;  
  187. (3) j<=n-1, (4), (6);  
  188. (4) kj kj+1, kj+1>kj, j=j+1, j ;  
  189. (5) temp kj, kj>temp, ki kj, i=j,j=2i+1, (3), (6)  
  190. (6) ki temp, 。  
  191. -----------------------------------------Code---------------------------  
  192. void HeapSort(SeqIAst R)  
  193.  
  194.     { // R[1..n] , R[0]     int I;    BuildHeap(R); // R[1-n] for(i=n;i>1;i--) // R[1..i] , n-1 。{      R[0]=R[1]; R[1]=R[i]; R[i]=R[0]; //       Heapify(R,1,i-1);  // R[1..i-1] , R[1]      }    } ---------------------------------------Code--------------------------------------  
  195.  
  196.    
  197. , , Heapify 。  
  198.  
  199.        O(nlgn)。 。      , 。      , O(1),      。  
  200.  
  201.    
  202. :  
  203.       , R[1..n] , n-1 , R[2..n] , n-2 。 , n-2 , n-1 , , 。  
  204.       , 。  
  205.    
  206.  
  207. 、  
  208.  :  
  209. : 。  
  210. :  
  211.  
  212.  
  213. , ( ), ( ) 。  
  214. ---------------------------------------Code--------------------------------------  
  215. void TopologicalSort()/* 。 G , G OK, ERROR*/  
  216. {  
  217.       int indegree[M];  
  218.       int i,k,j;  
  219.       char n;  
  220.       int count=0;  
  221.       Stack thestack;  
  222.       FindInDegree(G,indegree);// indegree[0....num]  
  223.       InitStack(thestack);//  
  224.       for(i=0;i<G.num;i++)  
  225.           Console.WriteLine(" "+G.vertices[i].data+" "+indegree[i]);  
  226.       for(i=0;i<G.num;i++)  
  227.       {  
  228.            if(indegree[i]==0)  
  229.               Push(thestack.vertices[i]);  
  230.       }  
  231.       Console.Write(" :");  
  232.       while(thestack.Peek()!=null)  
  233.       {  
  234.                Pop(thestack.Peek());  
  235.                j=locatevex(G,n);  
  236.                if (j==-2)  
  237.                   {  
  238.                          Console.WriteLine(" , 。");  
  239.                          exit();  
  240.                   }  
  241.                 Console.Write(G.vertices[j].data);  
  242.                 count++;  
  243.                 for(p=G.vertices[j].firstarc;p!=NULL;p=p.nextarc)  
  244.                 {  
  245.                      k=p.adjvex;  
  246.                      if (!(--indegree[k]))  
  247.                          Push(G.vertices[k]);  
  248.                 }  
  249.       }  
  250.       if (count<G.num)  
  251.           Cosole.WriteLine(" , , 。");  
  252.       else 
  253.           Console.WriteLine(" 。");  
  254. }  
  255. ----------------------------------------Code--------------------------------------  
  256. O(n+e)。  
  257.    
  258.    
  259.  
  260. 、  
  261. 。  
  262.      n , , n/2 ( ), ,  
  263.      n/2 , ,…, , 。  
  264.  
  265.  
  266.    
  267. --------------------------------Code in C---------------------------------------  
  268. #include <stdio.h>  
  269. #include <stdlib.h>  
  270. #include <string.h>  
  271. #include <math.h>  
  272. #define SIZE 100000  
  273. #define MAX 1000000  
  274. struct node  
  275. {  
  276.  long num;//  
  277.  char str[10];  
  278.  int lastwin;//  
  279.  int killer;//  
  280.  long times;//  
  281. }data[SIZE];  
  282. long CompareNum=0;  
  283. long ExchangeNum=0;  
  284. long Read(char name[])// a.txt , data[] ;  
  285. {  
  286.  FILE *fp;  
  287.  long i=1;  
  288.  fp=fopen(name,"rw");  
  289.  fscanf(fp,"%d%s",&data[i].num,data[i].str);  
  290.  while(!feof(fp))  
  291.  {  
  292.   i++;  
  293.   fscanf(fp,"%d%s",&data[i].num,data[i].str);   
  294.  }  
  295.  return (i-1);  
  296. }  
  297. long Create(long num)// , ( ) data[]  
  298. {  
  299.  int i,j1,j2,max,time=1;  
  300.  long min;//  
  301.  for(i=1;pow(2,i-1)<num;i++)  
  302.   ;  
  303.  max=pow(2,i-1);//  
  304.  for(i=1;i<=max;i++)//  
  305.  {  
  306.   data[i].killer=0;  
  307.   data[i].lastwin=0;  
  308.   data[i].times=0;  
  309.   if(i>num)  
  310.    data[i].num=MAX;  
  311.  }  
  312.  for(i=1;i<=max;i+=2)//  
  313.  {  
  314.   ++CompareNum;  
  315.   if(data[i].num <= data[i+1].num)  
  316.   {  
  317.    data[i].lastwin = i+1;  
  318.    data[i+1].killer=i;  
  319.    ++data[i].times;  
  320.    ++data[i+1].times;  
  321.    min=i;  
  322.   }  
  323.   else 
  324.   {  
  325.    data[i+1].lastwin=i;  
  326.    data[i].killer=i+1;  
  327.    ++data[i].times;  
  328.    ++data[i+1].times;  
  329.    min=i+1;  
  330.   }  
  331.  }  
  332.  j1=j2=0;//  
  333.  while(time <= (log(max)/log(2)))//  
  334.  {  
  335.   for(i=1;i<=max;i++)  
  336.   {  
  337.    if(data[i].times==time && data[i].killer==0)//  
  338.    {  
  339.     j2=i;//  
  340.     if(j1==0)// ,  
  341.      j1=j2;  
  342.     else// ,  
  343.     {  
  344.      ++CompareNum;  
  345.      if(data[j1].num <= data[j2].num)//  
  346.      {  
  347.       data[j1].lastwin = j2;// j2  
  348.       data[j2].killer=j1;//j2 j1  
  349.       ++data[j1].times;  
  350.       ++data[j2].times;// 1   
  351.       min=j1;// j1  
  352.       j1=j2=0;// j1,j2 0  
  353.      }  
  354.      else//  
  355.      {  
  356.       data[j2].lastwin=j1;  
  357.       data[j1].killer=j2;  
  358.       ++data[j1].times;  
  359.       ++data[j2].times;       
  360.       min=j2;  
  361.       j1=j2=0;  
  362.      }  
  363.     }  
  364.    }  
  365.     
  366.   }  
  367.   time++;// 1  
  368.  }  
  369.  return min;//  
  370. }  
  371. void TournamentSort(long num)//  
  372. {  
  373.  long tag=Create(num);//  
  374.  FILE *fp1;  
  375.  fp1=fopen("sort.txt","w+");// sort.txt  
  376.  while(data[tag].num != MAX)//  
  377.  {  
  378.   printf("%d %s
    "
    ,data[tag].num,data[tag].str);//  
  379.   fprintf(fp1,"%d %s
    "
    ,data[tag].num,data[tag].str);//  
  380.   data[tag].num=MAX;//  
  381.   tag=Create(num);//    
  382.  }  
  383. }  
  384. int main()  
  385. {  
  386.  int num;  
  387.  char name[10];  
  388.  printf("Input name of the file:");  
  389.  gets(name);  
  390.  num=Read(name);//  
  391.  TournamentSort(num);//  
  392.  printf("CompareNum=%d
    ExchangeNum=%d
    "
    ,CompareNum,ExchangeNum);  
  393.  return 0;  
  394. }  
  395. ------------------------------------------Code-------------------------------------  
  396.    
  397.    
  398. 、  
  399. 。 , 。  
  400.      , ;  
  401.      “ ” , “ ” 。  
  402. “ ” “ ” , 。  
  403. ———————————————————————————————————————  
  404. :  
  405.      “ ”: 。 :  
  406.      :§<¨<©<ª  
  407.      :2<3<……<K<A  
  408.      , ; 。 , , :  
  409.  §2,…,§A,¨2,…,¨A,©2,…,©A,ª2,…,ªA  
  410.      , 。  
  411.      : ( ), , 。  
  412. : ( ), , ( ), 。  
  413. ———————————————————————————————————————  
  414. :  
  415.    (Most Significant Digit first) , MSD : k1 , , k1 , k2 , , , kd 。 , 。  
  416.    (Least Significant Digit first) , LSD : kd , kd-1 , , k1 。  
  417. ---------------------------------Code in C#------------------------------------------  
  418.   using System;  
  419.   using System.Collections.Generic;  
  420.   using System.Linq;  
  421.   using System.Text;  
  422.   namespace LearnSort  
  423.   {  
  424.   class Program  
  425.   {  
  426.   static void Main(string[] args)  
  427.   {  
  428.   int[] arr = CreateRandomArray(10);//  
  429.   Print(arr);//  
  430.   RadixSort(ref arr);//  
  431.   Print(arr);//  
  432.   Console.ReadKey();  
  433.   }  
  434.   public static void RadixSort(ref int[] arr)  
  435.   {  
  436.   int iMaxLength = GetMaxLength(arr);  
  437.   RadixSort(ref arr, iMaxLength);  
  438.   }  
  439.   private static void RadixSort(ref int[] arr, int iMaxLength)  
  440.   {  
  441.   List<int> list = new List<int>();//  
  442.   List<int>[] listArr = new List<int>[10];//  
  443.   char currnetChar;// 123  2  
  444.   string currentItem;// 123  
  445.   for (int i = 0; i < listArr.Length; i++)// 。  
  446.   listArr[i] = new List<int>();  
  447.   for (int i = 0; i < iMaxLength; i++)// iMaxLength ,iMaxLength 。  
  448.   {  
  449.   foreach (int number in arr)//  
  450.   {  
  451.   currentItem = number.ToString();//  
  452.   try { currnetChar = currentItem[currentItem.Length-i-1]; }//  
  453.   catch { listArr[0].Add(number); continue; }// , listArr[0]。 5  , , , 5 0, listArr[0] 。  
  454.   switch (currnetChar)// currnetChar , 。  
  455.   {  
  456.   case '0': listArr[0].Add(number); break;  
  457.   case '1': listArr[1].Add(number); break;  
  458.   case '2': listArr[2].Add(number); break;  
  459.   case '3': listArr[3].Add(number); break;  
  460.   case '4': listArr[4].Add(number); break;  
  461.   case '5': listArr[5].Add(number); break;  
  462.   case '6': listArr[6].Add(number); break;  
  463.   case '7': listArr[7].Add(number); break;  
  464.   case '8': listArr[8].Add(number); break;  
  465.   case '9': listArr[9].Add(number); break;  
  466.   default: throw new Exception("unknow error");  
  467.   }  
  468.   }  
  469.   for (int j = 0; j < listArr.Length; j++)// , list  
  470.   foreach (int number in listArr[j].ToArray<int>())  
  471.   {  
  472.   list.Add(number);  
  473.   listArr[j].Clear();//  
  474.   }  
  475.   arr = list.ToArray<int>();//arr  
  476.   //Console.Write("{0} times:",i);  
  477.   Print(arr);//  
  478.   list.Clear();// list  
  479.   }  
  480.   }  
  481.   //  
  482.   private static int GetMaxLength(int[] arr)  
  483.   {  
  484.   int iMaxNumber = Int32.MinValue;  
  485.   foreach (int i in arr)//  
  486.   {  
  487.   if (i > iMaxNumber)  
  488.   iMaxNumber = i;  
  489.   }  
  490.   return iMaxNumber.ToString().Length;// ...  
  491.   }  
  492.   //  
  493.   public static void Print(int[] arr)  
  494.   {  
  495.   foreach (int i in arr)  
  496.   System.Console.Write(i.ToString()+'\t');  
  497.   System.Console.WriteLine();  
  498.   }  
  499.   // 。 0 1000。 iLength  
  500.   public static int[] CreateRandomArray(int iLength)  
  501.   {  
  502.   int[] arr = new int[iLength];  
  503.   Random random = new Random();  
  504.   for (int i = 0; i < iLength; i++)  
  505.   arr[i] = random.Next(0,1001);  
  506.   return arr;  
  507.   }  
  508.   }  
  509.   }  
  510. ---------------------------------Code ---------------------------------------------  
  511. , O (nlog(r)m), r , m , , 。