排序

复制代码
 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 }
复制代码
原文地址:https://www.cnblogs.com/wangsicongde/p/7599343.html