C#编写的 8种初级+高级排序方法

程序代码:

  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Linq; 
  4. using System.Text; 
  5.  
  6. namespace c_sharp_sort 
  7.     class Program 
  8.     { 
  9.         static void Main(string[] args) 
  10.         { 
  11.             int[] test7 = { 21, 13, 321, 231, 43, 7, 65, 18, 48, 6 }; 
  12.             heapsort(test7, 0, 9);                                         //堆排序 
  13.             foreach (int a in test7) 
  14.                 Console.Write(a.ToString().PadRight(4)); 
  15.             Console.WriteLine(); 
  16.  
  17.             int[] test6 = { 21, 13, 321, 231, 43, 7, 65, 18, 48, 6 }; 
  18.             radixsort(test6, 0, 9, 2);                                         //基数排序(第4个参数是数组中最大数的10的最大次瞑) 
  19.             foreach (int a in test6) 
  20.                 Console.Write(a.ToString().PadRight(4)); 
  21.             Console.WriteLine(); 
  22.  
  23.             int[] test0 = { 21, 13, 321, 231, 43, 7, 65, 18, 48, 6 };          
  24.             insertsort(test0, 10);                                             //插入排序 
  25.             foreach (int a in test0) 
  26.                 Console.Write(a.ToString().PadRight(4)); 
  27.             Console.WriteLine(); 
  28.  
  29.            int[] test1 = { 21, 13,321, 231, 43, 7, 65, 18, 48, 6 }; 
  30.             newinsertsort(test1, 10);                                          //折半插入排序 
  31.             foreach (int a in test1) 
  32.                 Console.Write(a.ToString().PadRight(4)); 
  33.             Console.WriteLine(); 
  34.  
  35.                  int[] test2 = { 21, 13,321, 231, 43, 7, 65, 18, 48, 6 }; 
  36.             shellsort(test2, 10);                                             //希尔排序 
  37.             foreach (int a in test2) 
  38.                 Console.Write(a.ToString().PadRight(4)); 
  39.             Console.WriteLine(); 
  40.  
  41.             int[] test3 = { 21, 13, 321, 231, 43, 7, 65, 18, 48, 6 }; 
  42.             paopaosort(test3, 10);                                            //冒泡排序 
  43.             foreach (int a in test3) 
  44.                 Console.Write(a.ToString().PadRight(4)); 
  45.             Console.WriteLine(); 
  46.  
  47.             int[] test4 = { 21, 13, 321, 231, 43, 7, 65, 18, 48, 6 }; 
  48.             fastsort(test4, 0, 9);                                            //快速排序 
  49.             foreach (int a in test4) 
  50.                 Console.Write(a.ToString().PadRight(4)); 
  51.             Console.WriteLine(); 
  52.  
  53.             int[] test5 = { 21, 13, 321, 231, 43, 7, 65, 18, 48, 6 }; 
  54.             selectsort(test5, 10);                                           //选择排序 
  55.             foreach (int a in test5) 
  56.                 Console.Write(a.ToString().PadRight(4)); 
  57.             Console.WriteLine(); 
  58.  
  59.             Console.Read(); 
  60.         } 
  61.         static public void heapsort(int[] array, int begin, int end)          //堆排序 
  62.         { 
  63.             int temp, i, j, length; 
  64.             for (i = (end - begin) / 2; i >= begin; i--)                                             //建初堆 
  65.             { 
  66.                 j = i; 
  67.                 while (j <= (end - begin) / 2) 
  68.                 { 
  69.                     if ((2 * j + 2) <= end) 
  70.                     { 
  71.                         if (array[2 * j + 1] > array[2 * j + 2] && array[2 * j + 1] > array[j]) 
  72.                         { 
  73.                             temp = array[2 * j + 1]; 
  74.                             array[2 * j + 1] = array[j]; 
  75.                             array[j] = temp; 
  76.                             j = 2 * j + 1; 
  77.                         } 
  78.                         else if (array[2 * j + 1] < array[2 * j + 2] && array[2 * j + 2] > array[j]) 
  79.                         { 
  80.                             temp = array[j]; 
  81.                             array[j] = array[2 * j + 2]; 
  82.                             array[2 * j + 2] = temp; 
  83.                             j = 2 * j + 2; 
  84.                         } 
  85.                         else 
  86.                             break
  87.                     } 
  88.                     else 
  89.                     { 
  90.                         if (array[2 * j + 1] > array[j]) 
  91.                         { 
  92.                             temp = array[2 * j + 1]; 
  93.                             array[2 * j + 1] = array[j]; 
  94.                             array[j] = temp; 
  95.                             j = 2 * j + 1; 
  96.                         } 
  97.                         break
  98.                     } 
  99.                 } 
  100.             } 
  101.             for (length = end; length > begin; length--)                              //首尾交换 
  102.             { 
  103.                 temp = array[length]; 
  104.                 array[length] = array[0]; 
  105.                 array[0] = temp; 
  106.                 j = 0; 
  107.                 while (j < (length - begin-1) / 2)                                   //调整堆 
  108.                 { 
  109.                     if ((2 * j + 2) <= end) 
  110.                     { 
  111.                         if (array[2 * j + 1] > array[2 * j + 2] && array[2 * j + 1] > array[j]) 
  112.                         { 
  113.                             temp = array[2 * j + 1]; 
  114.                             array[2 * j + 1] = array[j]; 
  115.                             array[j] = temp; 
  116.                             j = 2 * j + 1; 
  117.                         } 
  118.                         else if (array[2 * j + 1] < array[2 * j + 2] && array[2 * j + 2] > array[j]) 
  119.                         { 
  120.                             temp = array[j]; 
  121.                             array[j] = array[2 * j + 2]; 
  122.                             array[2 * j + 2] = temp; 
  123.                             j = 2 * j + 2; 
  124.                         } 
  125.                         else 
  126.                             break
  127.                     } 
  128.                 } 
  129.             } 
  130.         } 
  131.  
  132.         static public void insertsort(int[] array, int length)   //直接插入排序 
  133.         { 
  134.             int i,j,temp; 
  135.             for (i = 1; i < length; i++) 
  136.             { 
  137.                 temp = array[i]; 
  138.                 j=i-1; 
  139.                 while (temp<array[j]) 
  140.                 { 
  141.                     array[j + 1] = array[j]; 
  142.                     j = j - 1; 
  143.                     if (j == -1) 
  144.                     { 
  145.                         break
  146.                     } 
  147.                 } 
  148.                 array[j+1]=temp; 
  149.             } 
  150.         } 
  151.  
  152.         static public void newinsertsort(int[] array, int length)   //折半插入排序 
  153.         { 
  154.             int low,high, i,j,temp; 
  155.             for (i = 1; i <length; i++) 
  156.             { 
  157.                 temp = array[i]; 
  158.                 low = 0; high = i - 1; 
  159.                 j= (high-low)/2; 
  160.                 while (low<=high)        
  161.                 { 
  162.                     if (low == high) 
  163.                     { 
  164.                         if (array[0] > temp) 
  165.                             j = 0; 
  166.                         else 
  167.                             j = 1; 
  168.                         break
  169.                     } 
  170.                     else if (low == high - 1) 
  171.                     { 
  172.                         if (array[j + 1] < temp) 
  173.                             j += 2; 
  174.                         else if (array[j] < temp) 
  175.                             j++; 
  176.                         break
  177.                     } 
  178.                     else if (array[j] < temp) 
  179.                     { 
  180.                         low = j; 
  181.                         j += (high - low) / 2; 
  182.                     } 
  183.                     else if (array[j] > temp) 
  184.                     { 
  185.                         high = j; 
  186.                         j= low+(high - low) / 2; 
  187.                     } 
  188.                     else 
  189.                         break;                   
  190.                 } 
  191.                 for (int n = i-1 ; n >= j; n--) 
  192.                     array[n + 1] = array[n]; 
  193.                 array[j] = temp; 
  194.             } 
  195.         } 
  196.  
  197.         static public void shellsort(int[] array, int length)                 //希尔排序(基于直接插入排序) 
  198.         { 
  199.             int i, j,k,delta=length/2,temp; 
  200.             while(delta!=0)                                                 //delte为分组递增值 
  201.             { 
  202.                 for (i = 0; i < delta; i++) 
  203.                 { 
  204.                     for (j = i + delta; j < length; j += delta) 
  205.                     { 
  206.                         temp = array[j]; 
  207.                         k = j - delta; 
  208.                         while (temp < array[k])                             //对每组进行直接插入排序 
  209.                         { 
  210.                             array[k + delta] = array[k]; 
  211.                             k = k - delta; 
  212.                             if (k == i - delta) 
  213.                             { 
  214.                                 break
  215.                             } 
  216.                         } 
  217.                         array[k + delta] = temp; 
  218.                     } 
  219.                     j -= delta; 
  220.                     if (array[j] < array[i])                              //2组之间首位进行交换排序 
  221.                     { 
  222.                         temp = array[j]; 
  223.                         array[j] = array[j]; 
  224.                         array[j] = temp; 
  225.                     }                     
  226.                 } 
  227.                 delta /= 2; 
  228.             } 
  229.         } 
  230.  
  231.         static public void paopaosort(int[] array, int length)          //冒泡排序 
  232.         { 
  233.             int i, j, temp; 
  234.             j=length; 
  235.             while(j!=0) 
  236.             { 
  237.                 for (i = 0; i < j-1; i++) 
  238.                 {  
  239.                     if (array[i]>array[i+1]) 
  240.                     { 
  241.                         temp=array[i]; 
  242.                         array[i]=array[i+1]; 
  243.                         array[i+1]=temp; 
  244.                     } 
  245.                 } 
  246.                 j--; 
  247.             } 
  248.         } 
  249.  
  250.         static public void fastsort(int[] array, int begin,int end)         //快速排序 
  251.         { 
  252.             if (begin < 0 || end < 0 || begin >end) 
  253.                 return
  254.             int left = begin, right = end, temp;                            //经典的快排 
  255.             temp = array[left]; 
  256.             while (right != left) 
  257.             { 
  258.                 while (temp < array[right] && right>left) 
  259.                     right--; 
  260.                 if (right > left) 
  261.                 { 
  262.                     array[left] = array[right]; 
  263.                     left++; 
  264.                 } 
  265.                 while (temp > array[left] && right > left) 
  266.                     left++; 
  267.                 if (right > left) 
  268.                 { 
  269.                     array[right] = array[left]; 
  270.                     right--; 
  271.                 } 
  272.             } 
  273.             array[right] = temp; 
  274.             fastsort(array, right + 1, end); 
  275.             fastsort(array, begin, right-1);           
  276.         } 
  277.         static public void selectsort(int[] array, int length)        //选择排序 
  278.         { 
  279.             int i=0, j, min,temp_array,temp; 
  280.             while (i < length - 1) 
  281.             { 
  282.                 min = array[i]; 
  283.                 temp = i; 
  284.                 for (j = i+1; j < length; j++) 
  285.                 { 
  286.                     if (array[j] < min) 
  287.                     { 
  288.                         min = array[j]; 
  289.                         temp = j; 
  290.                     } 
  291.                 } 
  292.                 temp_array = array[i]; 
  293.                 array[i] = array[temp]; 
  294.                 array[temp] = temp_array; 
  295.                 i++; 
  296.             }            
  297.         } 
  298.         static public void radixsort(int[] array, int begin,int last, int pow)     //基数排序 
  299.         { 
  300.             Queue<int>[] queue = new Queue<int>[10];                               //利用泛型队列来存储筛选分组 
  301.             queue[0] = new Queue<int>(); 
  302.             queue[1] = new Queue<int>(); 
  303.             queue[2] = new Queue<int>(); 
  304.             queue[3] = new Queue<int>(); 
  305.             queue[4] = new Queue<int>(); 
  306.             queue[5] = new Queue<int>(); 
  307.             queue[6] = new Queue<int>(); 
  308.             queue[7] = new Queue<int>(); 
  309.             queue[8] = new Queue<int>(); 
  310.             queue[9] = new Queue<int>(); 
  311.             int[] nn={0,0,0,0,0,0,0,0,0,0}; 
  312.             int x, p = pow, n,i; 
  313.             while (p >= 0) 
  314.             { 
  315.         for (i=begin;i<=last;i++) 
  316.             {int sum=array[i];             
  317.             n=pow-p; 
  318.             while(n!=0) 
  319.             { 
  320.             sum=sum/10; 
  321.             n--;} 
  322.             sum=sum%10; 
  323.             switch (sum) 
  324.             {case 0: queue[0].Enqueue(array[i]);nn[0]++;break
  325.             case 1: queue[1].Enqueue(array[i]); nn[1]++; break
  326.             case 2: queue[2].Enqueue(array[i]); nn[2]++; break
  327.             case 3: queue[3].Enqueue(array[i]); nn[3]++; break
  328.             case 4: queue[4].Enqueue(array[i]); nn[4]++; break
  329.             case 5: queue[5].Enqueue(array[i]); nn[5]++; break
  330.             case 6: queue[6].Enqueue(array[i]); nn[6]++; break
  331.             case 7: queue[7].Enqueue(array[i]); nn[7]++; break
  332.             case 8: queue[8].Enqueue(array[i]); nn[8]++; break
  333.             case 9: queue[9].Enqueue(array[i]); nn[9]++; break
  334.             } 
  335.             }  //for 
  336.     x=n=0; 
  337.     for (i=0;i<10;i++) 
  338.         {n=n+x; 
  339.         x=nn[i]; 
  340.         while (nn[i]!=0) 
  341.         { 
  342.             array[n + x - nn[i]] = queue[i].Peek(); 
  343.             queue[i].Dequeue(); 
  344.             nn[i]--; 
  345.             }}           
  346.         p--;}    //while 
  347.         } 
  348.     } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值