zoukankan      html  css  js  c++  java
  • 排序

      堆排序

     1 #include<stdio.h>
     2 #include<iostream>
     3 using namespace std;
     4 
     5 
     6 void print(int a[], int n){  
     7     for(int j= 0; j<n; j++){  
     8         cout<<a[j] <<"  ";  
     9     }  
    10     cout<<endl;  
    11 }  
    12   
    13   
    14   
    15 /** 
    16  * 已知H[s…m]除了H[s] 外均满足堆的定义 
    17  * 调整H[s],使其成为大顶堆.即将对第s个结点为根的子树筛选,  
    18  * 
    19  * @param H是待调整的堆数组 
    20  * @param s是待调整的数组元素的位置 
    21  * @param length是数组的长度 
    22  * 
    23  */  
    24 void HeapAdjust(int H[],int s, int length)  
    25 {  
    26     int tmp  = H[s];  
    27     int child = 2*s+1; //左孩子结点的位置。(i+1 为当前调整结点的右孩子结点的位置)  
    28     while (child < length) {  
    29         if(child+1 <length && H[child]<H[child+1]) { // 如果右孩子大于左孩子(找到比当前待调整结点大的孩子结点)  
    30             ++child ;  
    31         }  
    32         if(H[s]<H[child]) {  // 如果较大的子结点大于父结点  
    33             H[s] = H[child]; // 那么把较大的子结点往上移动,替换它的父结点  
    34             s = child;       // 重新设置s ,即待调整的下一个结点的位置  
    35             child = 2*s+1;  
    36         }  else {            // 如果当前待调整结点大于它的左右孩子,则不需要调整,直接退出  
    37              break;  
    38         }  
    39         H[s] = tmp;         // 当前待调整的结点放到比其大的孩子结点位置上  
    40     }  
    41     print(H,length);  
    42 }  
    43   
    44   
    45 /** 
    46  * 初始堆进行调整 
    47  * 将H[0..length-1]建成堆 
    48  * 调整完之后第一个元素是序列的最小的元素 
    49  */  
    50 void BuildingHeap(int H[], int length)  
    51 {   
    52     //最后一个有孩子的节点的位置 i=  (length -1) / 2  
    53     for (int i = length/2 -1 ; i >= 0; --i)  
    54         HeapAdjust(H,i,length);  
    55 }  
    56 /** 
    57  * 堆排序算法 
    58  */  
    59 void HeapSort(int H[],int length)  
    60 {  
    61     //初始堆  
    62     BuildingHeap(H, length);  
    63     //从最后一个元素开始对序列进行调整  
    64     for (int i = length - 1; i > 0; --i)  
    65     {  
    66         //交换堆顶元素H[0]和堆中最后一个元素  
    67         int temp = H[i]; H[i] = H[0]; H[0] = temp;  
    68         //每次交换堆顶元素和堆中最后一个元素之后,都要对堆进行调整  
    69         HeapAdjust(H,0,i);  
    70   }  
    71 }   
    72   
    73 int main(){  
    74     int H[10] = {3,1,5,7,2,4,9,6,10,8};  
    75     cout<<"初始值:";  
    76     print(H,10);  
    77     HeapSort(H,10);  
    78     //selectSort(a, 8);  
    79     cout<<"结果:";  
    80     print(H,10);  
    81   
    82 }  

     基数排序

      1 #include<stdio.h>
      2 #include<stdlib.h>
      3 #include<windows.h>
      4 
      5 typedef struct node
      6 {
      7     int nValue;
      8     struct node *pNext;
      9 }MyRadix;
     10 
     11 void Sort(int arr[],int nLength,int nBase)
     12 {
     13     int nNum = 1;
     14     MyRadix **pRadix = NULL;
     15     int i;
     16     int nIndex;
     17     MyRadix  *pTemp = NULL;
     18     MyRadix *pMark = NULL;
     19 
     20     //求被除数
     21     while(nBase > 1)
     22     {
     23         nNum*=10;
     24         nBase--;
     25     }
     26 
     27     //申请桶
     28     pRadix = (MyRadix**)malloc(sizeof(MyRadix*) * 10);
     29     memset(pRadix,0,sizeof(MyRadix*) * 10);
     30 
     31     for(i = 0;i<nLength;i++)
     32     {
     33         nIndex = arr[i]/nNum%10;
     34 
     35         pTemp = (MyRadix*)malloc(sizeof(MyRadix));
     36         pTemp->nValue = arr[i];
     37         pTemp->pNext = NULL;
     38 
     39         //尾添加
     40         if(pRadix[nIndex] == NULL)
     41         {
     42             pRadix[nIndex] = pTemp;
     43         }
     44         else
     45         {
     46             pMark = pRadix[nIndex];
     47             while(pMark->pNext != NULL)
     48             {
     49                 pMark = pMark->pNext;
     50             }
     51             pMark->pNext = pTemp;
     52         }
     53     }
     54 
     55     //将元素放回原数组
     56     nBase = 0;
     57     for(i = 0;i<10;i++)
     58     {
     59         pMark = pRadix[i];
     60         while(pMark)
     61         {
     62             arr[nBase] = pMark->nValue;
     63             nBase++;
     64             pMark = pMark->pNext;
     65         }
     66     }
     67 
     68     //释放空间
     69     for(i = 0;i<10;i++)
     70     {
     71         pMark = pRadix[i];
     72         while(pMark)
     73         {
     74             pTemp = pMark;
     75             pMark = pMark->pNext;
     76             free(pTemp);
     77             pTemp = NULL;
     78         }
     79     }
     80 
     81     free(pRadix);
     82     pRadix = NULL;
     83 }
     84 
     85 void RadixSort(int arr[],int nLength)
     86 {
     87     int nMax;
     88     int i;
     89     int nLoopTimes;
     90     if(arr == NULL || nLength <=0)return;
     91     
     92     //找最大值
     93     nMax = arr[0];
     94     for(i = 1;i<nLength;i++)
     95     {
     96         if(arr[i] > nMax)
     97         {
     98             nMax = arr[i];
     99         }
    100     }
    101     //获得入桶次数
    102     nLoopTimes = 0;
    103     while(nMax)
    104     {
    105         nMax/=10;
    106         nLoopTimes++;
    107     }
    108 
    109     //各个位入桶
    110     for(i = 1;i<=nLoopTimes;i++)
    111     {
    112         //当前位入桶
    113         Sort(arr,nLength,i);
    114     }
    115 
    116 }
    117 
    118 int main()
    119 {
    120     int arr[] = {24,23,34,270,18,29,110,220,19,46,32};
    121     int i;
    122     RadixSort(arr,sizeof(arr)/sizeof(arr[0]));
    123     for(i = 0;i<sizeof(arr)/sizeof(arr[0]);i++)
    124     {
    125         printf("%d  ",arr[i]);
    126     }
    127     return 0;
    128 }

    桶排序

      1 #include<stdio.h>
      2 #include<stdlib.h>
      3 #include<windows.h>
      4 
      5 typedef struct node
      6 {
      7     int nValue;
      8     struct node *pPre;
      9     struct node *pNext;
     10 }MyBucket;
     11 
     12 //创建桶
     13 MyBucket **CreateBucket(int arr[],int nLength,int *pSize)
     14 {
     15     int nMax;
     16     int nMin;
     17     int nMaxIndex;
     18     int nMinIndex;
     19     int i;
     20     int nNum;
     21     int nIndex;
     22     MyBucket *pTemp = NULL;
     23     MyBucket **pBucket = NULL;
     24 
     25     if(arr == NULL || nLength <=0)return NULL;
     26 
     27     //查询最大值最小值
     28     nMax = arr[0];
     29     nMin = arr[0];
     30     for(i = 1;i<nLength;i++)
     31     {
     32         if(arr[i] > nMax)
     33         {
     34             nMax = arr[i];
     35         }
     36         if(arr[i] < nMin)
     37         {
     38             nMin = arr[i];
     39         }
     40     }
     41 
     42     //计算位数
     43     nNum = nMax;
     44     i = 0;
     45     while(nNum >0)
     46     {
     47         i++;
     48         nNum/=10;
     49     }
     50 
     51     //计算被除数
     52     nNum = 1;
     53     while(i >1)
     54     {
     55         nNum*=10;
     56         i--;
     57     }
     58 
     59     //根据最大值最小值建桶
     60     nMaxIndex = nMax/nNum;
     61     nMinIndex = nMin/nNum;
     62     *pSize = nMaxIndex-nMinIndex+1;
     63 
     64     pBucket = (MyBucket**)malloc(sizeof(MyBucket*)*(nMaxIndex-nMinIndex+1));
     65     memset(pBucket,0,sizeof(MyBucket*)*(nMaxIndex-nMinIndex+1));
     66 
     67     for(i = 0;i<nLength;i++)
     68     {
     69         nIndex = arr[i]/nNum - nMinIndex;
     70 
     71         pTemp = (MyBucket*)malloc(sizeof(MyBucket));
     72         pTemp->nValue = arr[i];
     73         pTemp->pPre = NULL;
     74 
     75         //双向链表头添加
     76         pTemp->pNext = pBucket[nIndex];
     77 
     78         if(pBucket[nIndex] != NULL)
     79         {
     80             pBucket[nIndex]->pPre = pTemp;
     81         }
     82 
     83         pBucket[nIndex] = pTemp;
     84     }
     85 
     86     return pBucket;    
     87 }
     88 
     89 void Sort(MyBucket *pHead)
     90 {
     91     MyBucket *pLast= NULL; //有序的最后一个
     92     MyBucket *pFirst = NULL; //无序的第一个
     93     int nNum;
     94 
     95     pFirst = pHead->pNext;
     96 
     97     while(pFirst != NULL)
     98     {
     99         //有序数组的最后一个 是无序数组的前一个
    100         pLast = pFirst->pPre;
    101 
    102         //标记待插入值
    103         nNum = pFirst->nValue;
    104 
    105         //将无序元素放入有序数组
    106         while(pLast != NULL && pLast->nValue > nNum)
    107         {
    108             pLast->pNext->nValue = pLast->nValue;
    109             pLast = pLast->pPre;
    110         }
    111 
    112         //到达链表头的情况
    113         if(pLast == NULL)
    114         {
    115             pHead->nValue = nNum;
    116         }
    117         else
    118         {
    119             pLast->pNext->nValue = nNum;
    120         }
    121 
    122         pFirst = pFirst->pNext;
    123     }
    124 }
    125 void BucketSort(int arr[],int nLength)
    126 {
    127     MyBucket **pBucket = NULL;
    128     int i;
    129     int nSize;
    130     int j;
    131     MyBucket *pMark = NULL;
    132     MyBucket *pDel = NULL;
    133 
    134     if(arr == NULL || nLength <=0)return;
    135 
    136     pBucket = CreateBucket(arr,nLength,&nSize);
    137 
    138     //各桶内进行排序
    139     for(i = 0;i<nSize;i++)
    140     {
    141         if(pBucket[i] != NULL)
    142         {
    143             Sort(pBucket[i]);
    144         }
    145     }
    146 
    147     //元素放回原数组
    148     j = 0;
    149     for(i = 0;i<nSize;i++)
    150     {
    151         pMark = pBucket[i];
    152         while(pMark)
    153         {
    154             arr[j] = pMark->nValue;
    155             pMark = pMark->pNext;
    156             j++;
    157         }
    158     }
    159     //空间释放
    160     for(i = 0;i<nSize;i++)
    161     {
    162         pMark = pBucket[i];
    163         while(pMark)
    164         {
    165             pDel = pMark;
    166             pMark = pMark->pNext;
    167             free(pDel);
    168             pDel = NULL;
    169         }
    170     }
    171 
    172     free(pBucket);
    173     pBucket = NULL;
    174 }
    175 
    176 
    177 int main()
    178 {
    179     int arr[] = {150,234,343,270,128,239,110,220,119,246,342};
    180     int i;
    181     BucketSort(arr,sizeof(arr)/sizeof(arr[0]));
    182     for(i = 0;i<sizeof(arr)/sizeof(arr[0]);i++)
    183     {
    184         printf("%d  ",arr[i]);
    185     }
    186     return 0;
    187 }
  • 相关阅读:
    HDU1074 Doing Homework(状压dp)
    HDU1069 Monkey and Banana(dp)
    HDU1024 Max Sum Plus Plus(dp)
    codeforces 1288E. Messenger Simulator(树状数组)
    codeforces 1288D. Minimax Problem(二分)
    geotrellis使用(三十二)大量GeoTiff文件实时发布TMS服务
    geotrellis使用(三十一)使用geotrellis直接将GeoTiff发布为TMS服务
    OpenStack(企业私有云)万里长征第六步——OpenStack网络及虚拟机存储位置
    geotrellis使用(三十)使用geotrellis读取PostGIS空间数据
    Docker Swarm——集群管理
  • 原文地址:https://www.cnblogs.com/13224ACMer/p/6422105.html
Copyright © 2011-2022 走看看