多种排序算法的实现与比较

排序算法的分类有多种分法. 是否是基于比较的; 是否是稳定排序; 当然也可按照时间复杂度和空间复杂度来进行划分. 而本文关注的重点在于时间复杂度及基于比较的排序. 基排序和计数排序等在此就不进行讨论了.

头文件 sort.h

 1 #include <iostream>
 2 
 3 class sort
 4 {
 5 public:
 6     static bool bubble_sort(int* arry, int n);//冒泡排序
 7     static bool insert_sort_no(int* arry, int n);//插入排序,非递归
 8     static bool insert_sort_re(int* arry, int n);//插入排序,递归
 9     static bool select_sort(int* arry, int n);//选择排序
10     static bool merge_sort(int* arry, int n);//归并排序
11     static bool heap_sort(int* arry, int n);//堆排序
12     static bool quick_sort(int* arry, int n);//快速排序
13 };

 

排序算法实现代码 

sort.cpp
  1 #include "sort.h"
  2 
  3 
  4 //功能: 插入排序,非递归
  5 //输入: 数组
  6 //输出: 已排序数组
  7 //版本: 1.0 
  8 //最后修改时间: 2012-7-5
  9 //修订人: 陈飞
 10 bool sort::insert_sort_no(int* num, int n)
 11 {
 12     if (n<1)
 13     {
 14         return false;
 15     }
 16 
 17     //插入排序
 18     int temp;
 19     for (int i=1; i<n; i++)
 20     {
 21         temp = num[i];
 22         int j;
 23         for(j=i-1; j>=0 && num[j]>temp; j--)
 24         {
 25             num[j+1]=num[j];
 26         }
 27         num[j+1] = temp;
 28         
 29     }
 30     return true;
 31 }
 32 
 33 //插入排序,递归
 34 //2012-7-14
 35 //大于一定数时栈溢出
 36 bool sort::insert_sort_re(int *arry, int n)
 37 {
 38     if (0==n)
 39     {
 40         return true;
 41     } 
 42     else
 43     {
 44         insert_sort_re(arry, n-1);
 45         //
 46         int temp = arry[n-1];
 47         int i;
 48         for (i=n-2; i>=0 && arry[i]>temp; i--)
 49         {
 50             arry[i+1]=arry[i];
 51         }
 52         arry[i+1]=temp;
 53     }
 54     return true;
 55 }
 56 
 57 
 58 //功能: 归并排序,递归
 59 //输入: 乱序数组
 60 //输出: 已排序数组
 61 //版本: 1.0
 62 //最后修改时间: 2012-7-9
 63 //修订人: 陈飞
 64 
 65 //归并辅助函数
 66 void merge_assist(int *arry1, int n1, int *arry2, int n2, int* whole)
 67 {
 68     //int* whole = (int *)malloc((n2+n1)*sizeof(int));
 69     int i1, i2;
 70     for (i1=0, i2=0; i1<n1 && i2<n2;)
 71     {//从两个数组中取小的到whole数组中
 72         if (arry1[i1]<arry2[i2])
 73         {
 74             whole[i1+i2] = arry1[i1++];
 75         } 
 76         else
 77         {
 78             whole[i1+i2] = arry2[i2++];
 79         }
 80     }
 81     //剩余排序的加到whole末尾
 82     if (i1==n1)
 83     {
 84         for (;i2<n2;i2++)
 85         {
 86             whole[i1+i2] = arry2[i2];
 87         }
 88     } 
 89     else
 90     {
 91         for (;i1<n1; i1++)
 92         {
 93             whole[i1+i2] = arry1[i1];
 94         }
 95     }
 96 
 97     //复制回原数组
 98     for(int i=0; i<n1+n2; i++)
 99     {
100         arry1[i] = whole[i];
101     }
102     //free(whole);
103 }
104 
105 void  merge_main(int *arry, int n, int* assist)
106 {
107     if (n>1)
108     {
109         merge_main(arry, n/2, assist);
110         merge_main(arry+n/2, n-n/2, assist);
111         merge_assist(arry, n/2, arry+n/2, n-n/2, assist);
112     }
113 }
114 
115 bool sort::merge_sort(int *arry, int n)
116 {
117     //辅助数组的生成
118     int* assist = (int*)malloc(sizeof(int)*n);
119     merge_main(arry, n, assist);
120     free(assist);
121     return true;
122 }
123 
124 
125 //冒泡排序 2012-7-31 v1.0
126 bool sort::bubble_sort(int *arry, int n)
127 {
128     int i, j, t;
129     for (i=0; i<n; i++)
130     {
131         for (j=0; j<n-i-1; j++)
132         {
133             if (arry[j]>arry[j+1])
134             {
135                 t=arry[j];
136                 arry[j]=arry[j+1];
137                 arry[j+1]=t;
138             }
139         }
140     }
141     return true;
142 }
143 //选择排序 2012-7-31 v1.0
144 bool sort::select_sort(int *arry, int n)
145 {
146     int i, j, t;
147     for (i=0;i<n;i++)
148     {
149         for (j=i+1;j<n;j++)
150         {
151             if (arry[j]<arry[i])
152             {
153                 t=arry[j];
154                 arry[j]=arry[i];
155                 arry[i]=t;
156             }
157         }
158     }
159     return true;
160 }
161 
162 
163 
164 //快排 2012-7-31 v1.0
165 bool sort::quick_sort(int *a, int n)
166 {
167     if(n<=1) return true;
168     else
169     {
170         //随机化快排
171         //swap(a[0], a[random(0,n-1)]);
172         int i=0, j=1,t;
173         for (;j<n;)
174         {
175             if (a[j]<a[0])
176             {
177                 t=a[i+1]; a[i+1]=a[j];a[j]=t;
178                 i++; j++;
179             } 
180             else
181             {
182                 j++;
183             }
184         }
185         t=a[i]; a[i]=a[0];a[0]=t;
186         quick_sort(a, i);
187         quick_sort(a+i+1, n-i-1);
188         return true;
189     }
190 }
191 
192 //堆排序
193 //2012-7-31 v1.0
194 void max_heapify(int* a, int n, int i)
195 {//最大堆的保持
196     int l = 2*i;
197     int r = 2*i + 1;
198     int max_value = i;
199     if (l<=n && a[l-1]>a[i-1])
200     {
201         max_value = l;
202     }
203     if (r<=n && a[r-1]>a[max_value-1])
204     {
205         max_value = r;
206     }
207     if (max_value != i)
208     {
209         int t=a[max_value-1];
210         a[max_value-1]=a[i-1];
211         a[i-1]=t;
212         max_heapify(a, n, max_value);
213     }
214 }
215 
216 void build_max_heap(int* a, int n)
217 {
218     int i;
219     for (i=n/2; i>0; i--)
220     {
221         max_heapify(a, n, i);
222     }
223 }
224 
225 bool sort::heap_sort(int *a, int n)
226 {
227     build_max_heap(a,n);
228     for (int i=n; n>1; n--)
229     {
230         int t = a[0]; a[0]=a[n-1]; a[n-1]=t;
231         max_heapify(a, n-1, 1);
232     }
233     return true;
234 }

 

冒泡排序

  最早学习的算法, 通过相邻两个数比较与交换. 最终达到排序的目的. 名为冒泡的原由在于比较过程当中犹如一个气泡不断上冒. 我在实现的时间却一直用着它的下沉. 时间复杂度为O(n), 空间复杂度为O(1).

选择排序

  不断选择最值放于其中一侧. 如:第一个数与后续逐个比较, 若小于(或大于)第一个数则交换. 一遍后第二个数如是行.时间复杂度为O(n*n), 空间复杂度为O(1).

插入排序

  假设先前的数已排好序, 通过不断将后一个数插入到先前有序数组中最终实现排序. 时间复杂度为O(n*n), 空间复杂度为O(1).

归并排序

  要排序一个数组,先排序其均分的两个子数组. 递归. 合并两个已排序的数组. 时间复杂度为O(nlog(n)), 空间复杂度为O(n).

快速排序

  随机选择一个数为轴, 大于该数的放于一端, 小于该数的放于另一端. 对两端的数组继续如是行. 直到数小于等于1为止.  平均时间复杂度为(nlog(n)), 空间复杂度为O(1).

堆排序

  构造堆, 通过不断取最值,重构进行排序. 时间复杂度为O(nlog(n)), 空间复杂度为O(1).

 

以下为其性能比较. 

单位毫秒. 计时方式误差较大. 

 冒泡选择插入归并快排堆排
2W14781450358   
20W  264507847200
200W   8008102330

 全部代码请见:https://github.com/uglyfly/sort

转载于:https://www.cnblogs.com/uglyfly/archive/2012/08/04/sorting.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
几种常见排序 基于比较排序算法: 下界是 nlgn 1.1 SelectionSort:每次选出最下的元素,放在当前循环最左边的位置。 1.2 BubbleSort:每次比较相邻的两个数,使得最大的数像气泡一样冒到最右边。 1. 3 InsertionSort:每次拿起一个数,插入到它左边数组的正确位置。 1.4 QuickSort:选择一个数,作为标准,小于它的放在左边,大于它的放在右边。并把它放在中间;递归地对左右子数组进行排序。 实现时:1. 确定递归结束条件,初始化左右游标, 选择标准数; 2. while循环,do while实现两个游标同时向中间移动,置换; 3. 置换标准数和右边游标所指的数; 4. 递归调用,对左右子数组进行排序。 1. 5 HeapSort:用最大堆实现实现时:建堆:置换堆顶元素和最后一个元素,堆大小减少,保持新的堆为最大堆; 保持最大堆: 从底向上依次保持最大堆,从第一个父节点到根部。 1.6 MergeSort:拆分数组,递归实现排序,二路归并。用哨兵来阻止游标的越界。 线性时间运行的算法: 1.7 CountingSort: 假设数据分布在0到k之间的。对于每个输入x,确定出小于x的数的个数。假设小于x的数有17个,那么x就应该在第18个输出位置。 1. 8 Radix sort(基数排序):从最低位开始,每位采用稳定的排序算法(如计数排序)。 1.9 Bucket sort:当输入数据比较均匀时采用。 先将数据区间分为n个桶,把数据分放到对应的桶中;对桶内的数据采用插入排序;再把各个桶的排序结果串起来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值