zoukankan      html  css  js  c++  java
  • 排序算法

      1 #include <iostream>
      2 #include <vector>
      3 using namespace std ;
      4 
      5 #define INFINITE 1000
      6 //主菜单
      7 void MainMenu()
      8 {
      9     cout << "****************************************" << endl ;
     10     cout << "*         1.InsertSort                 *" << endl ;
     11     cout << "*                                      *" << endl ;
     12     cout << "*         2.BubbleSort                 *" << endl ;
     13     cout << "*                                      *" << endl ;
     14     cout << "*         3.MergeSort                  *" << endl ;
     15     cout << "*                                      *" << endl ;
     16     cout << "*         4.HeapSort                   *" << endl ;
     17     cout << "*                                      *" << endl ;
     18     cout << "*         0.Exit                       *" << endl ;
     19     cout << "****************************************" << endl ;
     20 }
     21 
     22 //输入函数
     23 template<class T >
     24 void Input(vector<T >& v , int num)
     25 {
     26     v.resize(num);
     27     for (int i = 0; i < num;++ i)
     28     {
     29         cin >> v[i];
     30     }
     31     cout << endl ;
     32 }
     33 //输出函数
     34 template<class T >
     35 void print(vector<T>& v,int num)
     36 {
     37     v.resize(num);
     38     for (int i = 0; i < num;++ i)
     39     {
     40         cout << v[i] << " ";
     41     }
     42     cout << endl ;
     43 }
     44 
     45 /***************************以下代码实现插入排序*****************************/
     46 
     47 template<class T>
     48 void InsertSort(vector<T>& v , int size)
     49 {
     50     for (int i = 1;i<size;++i)
     51     {
     52         int t = v[i];
     53         int j = i;
     54         while (j>0 && v[j-1]>t)
     55         {
     56             v[j]=v[j-1];
     57             --j;
     58         }
     59         v[j] = t;
     60     }
     61 }
     62 /***************************以下代码实现冒泡排序*****************************/
     63 
     64 template<class T>
     65 void BubbleSort(vector<T > &v,int n)
     66 {
     67     v.resize(n);
     68     for (int i = n-2;i>=0;--i)
     69     {
     70         for (int j = 0;j<=i;++j)
     71         {
     72             if(v[j+1]<v[j])
     73             {
     74                 int t = v[j+1];
     75                 v[j+1]=v[j];
     76                 v[j]=t;
     77             }
     78 
     79         }
     80     }
     81 
     82 }
     83 /***************************以下代码实现归并排序*****************************/
     84 
     85 template<class T>
     86 void merge(vector<T>& v,int start,int mid,int end)  
     87 {  
     88     int i,j,k;  
     89     //申请辅助数组  
     90     int *array1 = new int[mid-start+2];
     91     int *array2 = new int[end-mid+1];
     92 
     93     //把a从mid分开分别赋值给数组  
     94     for(i=0;i<mid-start+1;i++)  
     95         *(array1+i)=v[start+i];  
     96     *(array1+i)=INFINITE;//作为哨兵  
     97     for(i=0;i<end-mid;i++)  
     98         *(array2+i)=v[i+mid+1];  
     99     *(array2+i)=INFINITE;  
    100     //有序的归并到数组a中  
    101     i=j=0;  
    102     for(k=start;k<=end;k++){  
    103         if(*(array1+i) > *(array2+j)){  
    104             v[k]=*(array2+j);  
    105             j++;  
    106         }  
    107         else{  
    108             v[k]=*(array1+i);  
    109             i++;  
    110         }  
    111     }  
    112     delete []array1;
    113     delete []array2;
    114 }  
    115 
    116 //归并排序  
    117 template<class T>
    118 void mergeSort(vector<T>& v,int start,int end)  
    119 {  
    120     int mid=(start+end)/2;  
    121     if(start<end){  
    122         //分解  
    123         mergeSort(v,start,mid);  
    124         mergeSort(v,mid+1,end);  
    125         //合并  
    126         merge(v,start,mid,end);  
    127     }  
    128 }  
    129 
    130 /***************************以下代码实现堆排序*****************************/
    131 /*求父亲*/ 
    132 int parent(int i)  
    133 {  
    134     return (int)floor((i) / 2);  //floor函数为向下取整
    135 }  
    136 
    137 /*求左孩子*/ 
    138 int left(int i)  
    139 {  
    140     return (2 * i);  
    141 }  
    142 
    143 /*求右孩子*/ 
    144 int right(int i)  
    145 {  
    146     return (2 * i + 1);  
    147 } 
    148 
    149 void Max_Heapify(vector<int>& A, int i, int heap_size)  
    150 {  
    151     int l = left(i);  
    152     int r = right(i);  
    153     int largest;   
    154 
    155     /*找到父亲 左孩子 右孩子 之间的最大值*/
    156     if(l <heap_size && A[l] > A[i])  
    157     {  
    158         largest = l;  
    159     }  
    160     else  
    161     {  
    162         largest = i;  
    163     }  
    164     if(r <heap_size && A[r] > A[largest])  
    165     {  
    166         largest = r;  
    167     }  
    168     /*如果父亲不是最大的,则把父亲和两个孩子的较大值交换 */ 
    169     if(largest != i)  
    170     {  
    171         swap(A[largest],A[i]);
    172         /*交换之后破坏了较大孩子的堆得性质,对其进行调整*/
    173         Max_Heapify(A, largest, heap_size);  
    174     }  
    175 }  
    176 void Build_Max_Heap(vector<int>& A,int size)  
    177 {   
    178     int begin = size/2 ;  // 堆顶元素  
    179     for(int i = begin; i >= 0; i--)  
    180     {  
    181         Max_Heapify(A, i, size);  
    182     }  
    183 }  
    184 void HeapSort(vector<int>& A, int heap_size)  
    185 {  
    186     Build_Max_Heap(A,heap_size);  
    187     //建立大顶堆之后 堆顶已经是所有元素中最大的了  
    188 
    189     //a[0]是数组的第一个元素 a[heap_size - 1]是数组的最后一个元素  
    190     /*将堆顶依次和最后一个叶子节点交换 */ 
    191     for(int i = heap_size - 1; i >= 0; i--)  
    192     {  
    193         swap(A[i],A[0]);
    194         //交换之后破坏了堆得性质 重新调整 */ 
    195         Max_Heapify(A, 0, i);  //i 是元素个数  每交换依次元素就少一个  
    196     }  
    197 } 
    198 
    199 int main()
    200 {
    201     MainMenu();
    202     vector<int> v ;
    203     int num  = 0;
    204     while (1)
    205     {
    206         int menu;
    207         cout << "Choice the method of sorting:";
    208         cin >> menu;
    209         cout << endl;
    210         if (menu == 0)
    211         {
    212             cout << "退出系统" << endl ;
    213             break;
    214         }
    215         cout << "Input the num of element will be sorted:";
    216         cin >> num ;
    217         cout << endl;
    218         cout<<"The origin array:";
    219         Input(v,num);
    220         cout << "before sorted:";
    221         print(v,num);    
    222         switch (menu)
    223         {
    224         case 1:
    225             InsertSort(v,num);
    226             break;
    227         case 2:
    228             BubbleSort(v,num);
    229             break;
    230         case 3:
    231             mergeSort(v,0,num-1);
    232             break;
    233         case 4:
    234             HeapSort(v,num);
    235             break;
    236         default:
    237             break;
    238         }
    239         cout << endl ;
    240         cout << "after sorted:";
    241         print(v,num);
    242         cout<<endl;
    243 
    244     }
    245     system("pause");
    246     return 0;
    247 }
  • 相关阅读:
    .NET2.0基础类库中的范型——FunctionalProgramming
    原则
    080711 30℃
    关于mcp
    080714 33℃
    080715 31℃
    080716 30℃
    11号
    iOS-调用系统的短信和发送邮件功能,实现短信分享邮件分享
    UIView总结
  • 原文地址:https://www.cnblogs.com/dzqdzq/p/3449282.html
Copyright © 2011-2022 走看看