内排序—数组实现(c++)

  1 参考资料:数据结构与算法分析(第三版)(c++)
  2           http://blog.csdn.net/theprinceofelf/article/details/6672677
  3
  4
  5
  6
  7     内排序,均采用数组实现,数组有较多的局限性,这些实现是为了去了解排序算法
  8 的操作流程
  9
 10 #include<iostream>
 11 using namespace std;
 12
 13 void Swap(int &a,int &b);
 14 void Print(int *array,int n);
 15 void BubbleSort(int *array,int n);
 16 void InsertSort(int *array,int n);
 17 void ShellSort(int *array,int n);
 18 void RadixSort(int *array,int n,int k,int r,int *cnt,int *B);
 19 void QuickSort(int Left,int Right,int *array);
 20 int FindPos(int Left,int Right);
 21 int Parttion(int Left,int Right,int& pos,int *A);
 22 void MergeSort(int Left,int Right,int *array,int *B);
 23 void ShellSort(int *array,int n);
 24 void IssSort(int *array,int n,int temp);
 25 void HeapSort(int *array,int n);
 26 void HeapAdjust(int *array,int high,int low);
 27 int main()
 28 {
 29     int n=20;
 30     int arry[n]={12,45,78,2,3,45,12,47,36,5,112,1178,14,20,10,58,74,65,24,17};
 31     //这两个数组主要是在用数组实现基数排序过程中要使用到
 32     int cnt[n];
 33     int B[n];
 34
 35     printf("要进行排序的数组为:\n");
 36     Print(arry,n);
 37
 38
 39     printf("冒泡排序:\n");
 40     BubbleSort(arry,n);
 41     Print(arry,n);
 42     printf("插入排序:\n");
 43     InsertSort(arry,n);
 44     Print(arry,n);
 45     printf("基数排序:\n");
 46     RadixSort(arry,n,4,10,cnt,B);
 47     Print(arry,n);
 48     printf("快速排序:\n");
 49     QuickSort(0,n-1,arry);
 50     Print(arry,n);
 51     printf("归并排序:\n");
 52     MergeSort(0,n-1,arry,B);
 53     Print(arry,n);
 54     printf("希尔排序:\n");
 55     ShellSort(arry,n);
 56     Print(arry,n);
 57     printf("堆排序:\n");
 58     HeapSort(arry,n);
 59     Print(arry,n);
 60     return 0;
 61 }
 62
 63
 64
 65 void Swap(int &a,int &b)
 66 {
 67     int temp=a;
 68     a=b;
 69     b=temp;
 70 }
 71
 72 void Print(int *array,int n)
 73 {
 74
 75     for(int i=0;i<n;i++)
 76     {
 77         printf("%d\t",array[i]);
 78     }
 79     printf("\n\n");
 80 }
 81
 82 //冒泡排序的时间复杂度为n^2,稳定
 83 void BubbleSort(int *array,int n)
 84 {
 85     for(int i=0;i<n;i++)
 86     {
 87         //for(int j=n-i;j>0;j--)  //这个是从最后一位开始进行冒泡排序,比较直观
 88         for(int j=0;j<n-1-i;j++)
 89         {
 90             if(array[j]>array[j+1])
 91             {
 92                 Swap(array[j],array[j+1]);
 93             }
 94         }
 95     }
 96 }
 97
 98 //插入排序的实现
 99 void InsertSort(int *array,int n)
100 {
101     for(int i=1;i<n;i++)
102     {
103         for(int j=i;j>0;j--)
104         {
105             if(array[j]<array[j-1])
106             {
107                 Swap(array[j],array[j-1]);
108             }
109         }
110     }
111 }
112
113
114
115 //基数排序的数组实现的过程
116  /*参数的意义:三个数组为交换过程中的使用,标记位置过程的使用,原数组
117  K为要进行排序的数组中数字的最大位数,r为进制*/
118 void RadixSort(int *array,int n,int k,int r,int *cnt,int *B)
119 {
120     int j;
121
122     for(int i=0,rtoi=1;i<k;i++,rtoi*=r)
123     {
124         for(j=0;j<r;j++)
125         {
126             cnt[j]=0;
127         }
128         for(j=0;j<n;j++)
129         {
130             cnt[(array[j]/rtoi)%r]++;
131         }
132         for(j=1;j<r;j++)
133         {
134             cnt[j]=cnt[j]+cnt[j-1];
135         }
136         for(j=n-1;j>=0;j--)
137         {
138             //式子中所要表达的就是进行取余,从最低位开始进行
139             B[--cnt[(array[j]/rtoi)%r]]=array[j];
140         }
141         for(j=0;j<n;j++)
142         {
143             array[j]=B[j];
144         }
145     }
146 }
147
148
149
150 //快速排序实现,选择轴值在中间,但是在极端情况下,轴值在首位或者末尾均可
151 //快速排序的优化有许多的方式,可以用堆栈代替递归,子数组在排序时长度的选择均可以进行优化
152 void QuickSort(int Left,int Right,int *A)
153 {
154    if (Left >= Right)
155     {
156         return;
157     }
158     //将轴值放在数组的最后
159     int pos = FindPos(Left, Right);
160     Swap(pos, Right);
161     // Left-1这个位置在数组的下界之前,目的是为了防止溢出
162     int k = Parttion(Left - 1, Right, A[Right],A);
163     Swap(k, Right);
164     QuickSort(Left, k - 1,A);
165     QuickSort(k + 1, Right,A);
166 }
167
168
169 int FindPos(int Left, int Right)
170 {
171     return (Left + Right) /2;
172 }
173
174
175 int Parttion(int Left, int Right, int& pos,int *A)
176 {
177     int i = Left;
178     int j = Right;
179     do
180     {
181         while ((pos>=A[Left])&&(Left<Right))
182         {
183             Left++;
184         }
185         //此处Left<Right保证了当轴值为子数组的最小值(即分隔出来以后左半部分的长度为0)不会越界
186         while ((Left < Right) && (pos <=A[Right]))
187         {
188             Right--;
189         }
190         Swap(Left, Right);
191     } while (Left < Right);
192     return Left;
193 }
194
195
196
197 //归并排序的实现:
198 void MergeSort(int Left,int Right,int *array,int *B)
199 {
200     if(Left==Right)
201     {
202         return;
203     }
204     int mid=(Left+Right)/2;
205     MergeSort(Left,mid,array,B);
206     MergeSort(mid+1,Right,array,B);
207     //复制到数组B中进行操作
208     for(int i=Left;i<=Right;i++)
209     {
210         B[i]=array[i];
211     }
212
213     int i=Left,j=mid+1;
214     for(int k=Left;k<=Right;k++)
215     {
216         //左侧数组是否已经用完
217         if(i==mid+1)
218         {
219             array[k]=B[j++];
220         }
221         //右侧数据是否用完
222         else if(j>Right)
223         {
224             array[k]=B[i++];
225         }
226         //均未用完,则需要进行比较归位
227         else if(B[i]<B[j])
228         {
229             array[k]=B[i++];
230         }
231         else
232         {
233             array[k]=B[j++];
234         }
235     }
236 }
237
238
239 //希尔排序的实现
240 //希尔排序的最后一轮处理其实就是插入排序
241 void ShellSort(int *array,int n)
242 {
243     for(int i=n/2;i>2;i/=2)
244     {
245         for(int j=0;j<i;j++)
246         {
247             IssSort(&array[j],n-j,i);
248         }
249         //最后一次处理为插入排序。所以增量为1
250         IssSort(array,n,1);
251     }
252 }
253
254
255
256 void IssSort(int *array,int n,int temp)
257 {
258     for(int i=temp;i<n;i+=temp)
259     {
260         for(int j=i;(j>=temp)&&(array[j]<array[j-temp]);j-=temp)
261         {
262             Swap(array[j],array[j-temp]);
263         }
264     }
265 }
266
267
268
269
270 //堆排序的实现
271 void HeapSort(int *array,int n)
272 {
273     for(int i=n/2-1;i>=0;--i)
274     {
275         HeapAdjust(array,i,n-1);
276     }
277     for(int i=n-1;i>0;--i)
278     {
279         Swap(array[0],array[i]);
280         HeapAdjust(array,0,i-1);
281     }
282 }
283
284
285
286 void HeapAdjust(int *array,int low,int high)
287 {
288     int temp=array[low];
289     for(int i=low*2+1;i<=high;i*=2)
290     {
291         if(i<high&&array[i]<=array[i+1])
292         {
293             ++i;
294         }
295         if(array[i]<=temp)
296         {
297             break;
298         }
299         array[low]=array[i];
300         low=i;
301     }
302     array[low]=temp;
303 }  
时间: 2024-10-17 09:45:45

内排序—数组实现(c++)的相关文章

数组排序 block排序 和数组内排序

#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //数组内排序 NSArray *[email protected][@"MON",@"TUE",@"WED",@"THU",@"FRI",@"SAT",@"SUN"

关于数组内排序计算次数的问题

不废话,直接上代码. 1.获取5个数中的最大数: int[] score = {66,77,88,65,88}; int max = score[0]; for(int i=0;i<score.length-1;i++){ if(max<score[i+1]){ max = score[i+1]; } } 由此可以看出,计算的总次数为 计算个数   2   3   4    5  ... n 计算次数   1   2   3    4  ... n-1 最小数次数一样. 2.将6个数从小到大排

Lua中table内建排序与C/C++/Java/php/等内排序算法的排序效率比较

Lua这类脚本语言在处理业务逻辑作为配置文件的时候方便省事 但是在大量需要 运算的地方就显得略微不足   按照 Lua内建排序算法 对比C/C++ PHP Java等的快速排序算法进行一下比较. 快速排序算法是基于冒泡排序,优化而来,时间复杂度T(n)=O(nLog2n)  ,可见内部采用了二分策略 . 发现在LuaIDE LDT下直接运行效率要比 通过C++加载运行Lua脚本效率高的多  拿500W个数据排序 来说  ,脚本如下 同样的排序脚本Lua解释器的内置排序算法在LDT下,运行速度比通

不可变数组或者可变数组进行排序

#import <Foundation/Foundation.h> NSInteger myCompare(id obj1,id obj2,void *context) { //不分大小写进行升序排序 //return [obj1 caseInsensitiveCompare:obj2]; return -[obj1 caseInsensitiveCompare:obj2]; } int main(int argc, const char * argv[]) { @autoreleasepoo

OC 之字典/数组混合使用(删除元素 描述器排序)

注:字典在数组内排序用描述器排序,遍历用字典对象输出!!!!!! NSArray *[email protected][@{@"name":@"Tim Cook",@"age":@"24",@"sex":@"female",@"score":@"89"},@{@"name":@"Jony Ive",@&quo

如何实现在O(n)时间内排序,并且空间复杂度为O(1)

对于常见的排序算法,很难做到在O(n)时间内排序,并且空间复杂度为O(1),这里提供了一种方法可以达到要求. 可以使用哈希排序的思想,也就是将所有的数哈希到哈希表中,实现排序.具体的算法思想是,求出这组数据的最大值和最小值,分三种情况讨论: 1.如果最小值为负数,在哈希的时候把每个数都加上最小值的相反数,作为数组的下标值. 2.如果最小值为0,则直接将每个数作为下标值 3.如果最小值为正数,则将每个数减去最小值作为下标值 综合三种情况,可以归结为一个方法,就是令每个数减去最小值即可. 这样就可以

内排序之希尔排序

body { background-color: white } .markdown-body { min-width: 200px; max-width: 760px; margin: 0 auto; padding: 20px; color: #333; overflow: hidden; font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif; font

Java 实现常见内排序

一.内排序 1.排序基本概念 (1)什么是排序? 排序指将一个数据元素集合或者序列 按照某种规则 重新排列成一个 有序的集合或者序列.分为内排序.外排序.排序算法的好坏直接影响程序的执行速度以及存储空间的占有量. (2)什么是内排序?外排序? 内排序:指待排序的序列完全存放在内存中所进行的排序过程(不适合大量数据排序). 外排序:指大数据的排序,待排序的数据无法一次性读取到内存中,内存与外存需进行多次数据交换,以达到排序的目的. (3)什么是稳定排序? 稳定排序指的是 相等的数据经过某种排序算法

移除数组中第一个负数后的所有负数

scala> val a = ArrayBuffer[Int](1, 2,3, 5, -1, 2, -3, -5) a: scala.collection.mutable.ArrayBuffer[Int]= ArrayBuffer(1, 2, 3, 5, -1, 2, -3 , -5)   scala> :paste // Entering paste mode (ctrl-D tofinish)   var foundFirstNegative = false val keepIndexes