几种排序算法的C++实现——快速排序、堆排序、基数排序

排序算法是非常常见的面试笔试问题,考查的一个人的基本功,本文将一些排序做了C++的实现,就当是做个学习总结吧。

1、快速排序

  快速排序的中心是填坑法,取一个数(这里选取第一个数)作为基准数temp,从队尾开始寻找第一个比基准数小的数a[j],交换a[j]和temp,然后队首开始查找第一个比temp大的数a[i],交换之,遍历的结果是当i>=j时,temp左边的数都小于temp,后边的数都大于temp,这个有点像归并排序。最后利用递归调用完成排序,代码如下:

 1 void QuickSort(int a[], int l,int r){
 2     if(l<r){
 3         int i=l,j=r,temp=a[l];
 4         while(i<j){
 5             while(i<j&&temp<=a[j])
 6                 --j;
 7             if(i<j)
 8                 a[i++]=a[j];
 9
10             while(i<j&&temp>a[i])
11                 ++i;
12             if(i<j)
13                 a[j--]=a[i];
14         }
15         a[i]=temp;
16         QuickSort(a,l,i-1);
17         QuickSort(a,i+1,r);
18     }
19 }

  在笔试题中很多人选择快速排序作为基础算法对数组进行排序,一般认为快速排序是内部排序中最好的排序法之一,其平均时间复杂度为O(nlogn),但在已经完成排序的情况下,其最坏复杂度可以为O(n^2),且不稳定。

2、堆排序

  堆排序是基于完全二叉树的排序方法,其中心思想是首先构造最大堆(或最小堆),即父节点总是大于其子节点,然后将堆化的数组a[0]与a[i]交换,即将最大数置于i位置,再将0—i的继续堆化,重新选出最大的数于a[0],完成第一个排序。经过遍历完成排序,其代码为:

 1 //构造最大堆
 2 void MaxHeapFixDown(int a[], int i, int n){
 3     int j = 2*i+1;
 4     int temp = a[i];
 5     while(j<n){
 6         if(j+1<n&&a[j]<a[j+1])
 7             ++j;
 8         if(temp>a[j])
 9             break;
10         else{
11             a[i]=a[j];
12             i=j;
13             j=2*i+1;
14         }
15     }
16     a[i]=temp;
17 }
18
19 //堆排序
20 void HeapSort(int a[], int n){
21     for(int i= n/2-1;i>=0;i--)
22         MaxHeapFixDown(a,i,n);
23     for(int i=n-1;i>=1;i--){
24         swap(a[i],a[0]);
25         MaxHeapFixDown(a,0,i);
26     }
27 }

  堆排序相对快速排序最大的有点时即便在最坏的情况下其复杂度也能达到O(nlogn),但也是不稳定排序.

3、基数排序

  基数排序中心思想是基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。具体介绍可以参考http://www.cnblogs.com/Braveliu/archive/2013/01/21/2870201.html,代码如下:

 1 //寻找数组中最大数的位数作为基数排序循环次数
 2 int KeySize(int a[], int n){
 3     int key = 1;
 4     for(int i=0;i<n;i++){
 5         int temp = 1;
 6         int r = 10;
 7         while(a[i]/r>0){
 8             temp++;
 9             r*=10;
10         }
11         key = (temp>key)?temp:key;
12     }
13     return key;
14 }
15
16 //基数排序
17 void RadixSort(int a[], int n){
18     int key = KeySize(a,n);
19     int bucket[10][10]={0};
20     int order[10]={0};
21     for(int r = 1;key>0;key--,r*=10){
22         for(int i=0;i<n;i++){
23              int lsd = (a[i]/r)%10;
24              bucket[lsd][order[lsd]++]=a[i];
25         }
26
27         int k = 0;
28         for(int i = 0;i<10;i++){
29             if(order[i]!=0){
30                 for(int j = 0;j<order[i];j++)
31                     a[k++]=bucket[i][j];
32             }
33             order[i]=0;
34         }
35     }
36 }

  基数排序是稳定算法,效率很高,其复杂度为O(nlog(r)m),其中r为所采取的基数,而m为堆数。但它只能用在整数的排序中,且需要借助一定的辅助空间。

*************************************************************************

先暂时跟新到这。。。。。

几种排序算法的C++实现——快速排序、堆排序、基数排序

时间: 2025-01-16 01:03:15

几种排序算法的C++实现——快速排序、堆排序、基数排序的相关文章

八种排序算法效率比较

从刚上大一那会儿学的C语言开始,就已经接触到了不少排序算法,但当时都只是为了完成简单的排序任务而已,而且所给的数据也不够多,所以看不出各个排序算法间的执行效率的优劣.最近有个数据结构课程设计的实验,是有关于排序算法之间的效率比较,我就顺便把它放上来了,并对各个算法执行的效率时间做了柱形统计图表.此次实验主要测试了8种排序算法:插入排序.快速排序.冒泡排序.希尔排序.简单选择排序.堆排序.归并排序.折半插入排序. 总共建立了三种情况,分别是平均排序.最好情况排序.最坏情况排序.第一种情况就是使用了

八种排序算法

最近一段时间自己在研究各种排序算法,于是自己写了一个八种排序算法的集合: /************************************************************************* > Copyright (c)2014 stay hungry,stay foolish !!! > File Name: sort.cpp > Author: kanty > Mail: [email protected] > Created Time:

数据结构中的7种排序算法

数据结构中的7种排序算法 排序是将一个记录的任意序列重新排列成一个按键值有序的序列. 时间复杂度主要考虑元素的移动次数. 结构如下: 1.直接插入排序 1,定义:依次将待排序序列中的每一个记录插入到一个已经排好序的序列中,直到全部记录都排好序. 2,时间复杂度:在最好情况下,待排序序列为正序,时间复杂度为O(n):最坏情况下,待排序序列为逆序,时间复杂度为O(n^2);平均情况下,时间复杂度为O(n^2). 3,空间复杂度:O(1). public static void insertSort(

总结N种排序算法及实现

排序算法是一个简单的问题,但在此问题上却有大量的研究!当前的排序算法通常按照如下四个方面进行分类(或是评价): 1.时间复杂度:一个排序算法的理想性能是O(n).一般而言,好的性能O(nlogn),坏的性能O(n2). 2.空间复杂度(内存使用量) 3.稳定性:稳定的排序算法会让原本有相等键值的记录维持原本的相对次序. 4.排序方式:插入.交换.选择.合并等 一.冒泡排序:这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端. 步骤:1.比较相邻的两个元素,如果第一个比第二个大,就

#排序算法#【4】快速排序

快速排序法是对冒泡排序的一种改进,本来是要和冒泡排序写在一个文章里的,不过前两天刚开始在递归调用的时候没有完全理解,昨天晚上google了一把发现原来自己理解错了,我看的这个教材没有写清楚,今天早上调试了一把终于成功. 快速排序算法的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 快速排序使用分治策略来把待排序数据序列分为两个子序列

八种排序算法(内部排序)

八种排序算法很长时间没有使用了,今天做一个总结,方便以后自己用的时候参考. 这八种排序算法都是内部算法,这八种排序算法分别是: 1. 插入排序 1)直接插入排序 2)希尔排序 2.选择排序 1)简单选择排序 2)堆排序 3.交换排序 1)冒泡排序 2)快速排序 4.归并排序 5.基数排序 一.直接插入排序 将一个记录插入到已经排好序的有序表中,从而得到一个新的.记录数增1的有序表.在实际操作中,先将序列的第一个记录看成是一个有序的子序列,然后从第二个.第三个.……记录逐个进行插入,直至整个序列有

12种排序算法:原理、图解、动画视频演示、代码以及笔试面试题目中的应用

出处:http://blog.csdn.net/han_xiaoyang/article/details/12163251. 声明:版权所有,转载请注明出处,谢谢. 0.前言 从这一部分开始直接切入我们计算机互联网笔试面试中的重头戏算法了,初始的想法是找一条主线,比如数据结构或者解题思路方法,将博主见过做过整理过的算法题逐个分析一遍(博主当年自己学算法就是用这种比较笨的刷题学的,囧),不过又想了想,算法这东西,博主自己学的过程中一直深感,基础还是非常重要的,很多难题是基础类数据结构和题目的思想综

四种排序算法PHP实现类

四种排序算法的PHP实现:1) 插入排序(Insertion Sort)的基本思想是: 每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止. 2) 选择排序(Selection Sort)的基本思想是: 每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕. 3) 冒泡排序的基本思想是: 两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止. 4) 快速排序实质上和

几种排序算法及Java实现排序的几种方式

几种排序算法 下面的例子介绍了4种排序方法: 冒泡排序, 选择排序, 插入排序, 快速排序 1 package date201709.date20170915; 2 3 public class SortUtil { 4 5 private static int quickSortTimes = 1; 6 7 /** 8 * 冒泡排序:<br> 9 * 两层循环,每次循环比较前后两个元素,如果他们的顺序错误就把他们交换过来,一次循环后最终会把最大的数沉到数列的末端<br> 10 *