sort.cpp

#include "stdafx.h"
#include <stdlib.h>#define swap(x,y,t) t = x, x = y, y = t
/*****************************************************************************函 数 名  : BubbleSort功能描述  : 冒泡排序,每次将最小的数"冒"在最前面输入参数  : int *SortArray   int ArrayLength  输出参数  : 无返 回 值  : 调用函数  : 被调函数  : 修改历史      :1.日    期   : 2012年9月1日作    者   : 风痕修改内容   : 新生成函数*****************************************************************************/
void BubbleSort(int *SortArray, int ArrayLength)
{int i, j;int temp;for(i = 0; i != ArrayLength; i++){for(j = i+1; j != ArrayLength; j++){if(SortArray[i] > SortArray[j]){swap(SortArray[i], SortArray[j], temp);    }}}
}/*****************************************************************************函 数 名     : InsertSort功能描述  : 插入排序,从后往前依次插入元素输入参数  : int *SortArray   int ArrayLength  输出参数  : 无返 回 值  : 调用函数  : 被调函数  : 修改历史      :1.日    期   : 2012年9月1日作    者   : 风痕修改内容   : 新生成函数*****************************************************************************/
void InsertSort(int SortArray[], int ArrayLength)
{int i, j;int key;for(j = 1; j  != ArrayLength; j++){key = SortArray[j];i = j - 1;while(i != -1 && SortArray[i] > key){SortArray[i+1]= SortArray[i];i--;}SortArray[i+1] = key;}
}static void Merge(int SortArray[], int start, int middle, int end)
{int LeftLength = middle - start + 1;int RightLength = end - middle;// 创建临时数组保存已排序好的左右数组int *LeftArray = (int *)malloc(LeftLength * sizeof(int));for(int i = 0; i != LeftLength; ++i)LeftArray[i] = SortArray[start + i];int *RightArray = (int *)malloc(RightLength * sizeof(int));for(int i = 0; i != RightLength; ++i)RightArray[i] = SortArray[middle + i + 1];// 归并int i = 0;int j = 0;int k = start;while(i != LeftLength && j != RightLength){if(LeftArray[i] <= RightArray[j])SortArray[k++] = LeftArray[i++];elseSortArray[k++] = RightArray[j++];}while(i != LeftLength){SortArray[k++] = LeftArray[i++];  }while(j != RightLength){SortArray[k++] = RightArray[j++];}free(LeftArray);free(RightArray);
}/*****************************************************************************函 数 名  : MergeSort功能描述  : 归并排序,分别对左右两边进行排序,然后合并,需要申请新的空间输入参数  : int SortArray[]  int start        int end          输出参数  : 无返 回 值  : 调用函数  : 被调函数  : 修改历史      :1.日    期   : 2012年9月1日作    者   : 风痕修改内容   : 新生成函数*****************************************************************************/
void MergeSort(int SortArray[], int start, int end)
{if (start < end){int middle = ( start + end ) / 2;MergeSort(SortArray, start, middle);MergeSort (SortArray, middle + 1, end);Merge(SortArray, start, middle, end);}
}/*****************************************************************************函 数 名  : Partition功能描述  : 将数组划分为2组,左边的都比中间元素小,右边的都比中间元素大输入参数  : int SortArray[]  int start        int end          输出参数  : 无返 回 值  : static调用函数  : 被调函数  : 修改历史      :1.日    期   : 2012年9月1日作    者   : 风痕修改内容   : 新生成函数*****************************************************************************/
static int Partition(int SortArray[], int start, int end)
{int middleValue = SortArray[end];int middleIndex = start - 1;int exchange;for(int j = start; j != end; ++j){if (SortArray[j] <= middleValue){middleIndex++;swap(SortArray[middleIndex], SortArray[j], exchange);}}swap(SortArray[middleIndex+1], SortArray[end], exchange);return middleIndex+1;
}/*****************************************************************************函 数 名  : QuickSort功能描述  : 快速排序算法,和归并排序相比,快速排序不需要额外的空间输入参数  : int SortArray[]  int start        int end          输出参数  : 无返 回 值  : 调用函数  : 被调函数  : 修改历史      :1.日    期   : 2012年9月1日作    者   : 风痕修改内容   : 新生成函数*****************************************************************************/
void QuickSort(int SortArray[], int start, int end)
{if(start < end){int middle = Partition(SortArray, start, end);QuickSort(SortArray, start, middle-1);QuickSort(SortArray, middle+1, end);}
}/*****************************************************************************函 数 名  : CountingSort功能描述  : 计数排序计数排序的基本思想是对每一个输入元素x,确定出不小于x的元素个数。只适用于正整数输入参数  : int SortArray[]  :待排序的数组int SortedArray[]: 排序好的数组(输出参数)int ArrayLength :数组长度 int maxValue: 数组中元素的最大值     输出参数  : 无返 回 值  : 调用函数  : 被调函数  : 修改历史      :1.日    期   : 2012年9月1日作    者   : 风痕修改内容   : 新生成函数*****************************************************************************/
void CountingSort(int SortArray[], int SortedArray[], int ArrayLength,int maxValue)
{int *CountArray  = (int *)malloc((maxValue+1) * sizeof(int));// 初始化for(int i = 0; i != maxValue+1; ++i)CountArray[i] = 0;// 计数for(int i = 0; i != ArrayLength; ++i)CountArray[(SortArray[i])] += 1;  // 等于的元素个数for(int i = 1; i != maxValue+1; ++i)CountArray[i] += CountArray[i-1];  // 小于或等于的个数// 重排/*从大到小,可保持稳定性,即具有相同值的元素在输出数组中的相对次序与他们在输入数组中的次序相同*/for(int i = ArrayLength-1; i != -1; --i){SortedArray[(CountArray[(SortArray[i])]) - 1] = SortArray[i]; // -1:下标从0开始CountArray[(SortArray[i])] -= 1;}free(CountArray);
}static void CountingSortForRadixSort(int SortArray[], int CmpArray[], int ArrayLength, int maxValue)
{int *CountArray  = (int *)malloc((maxValue+1) * sizeof(int));int *SortedArray = (int *)malloc(ArrayLength * sizeof(int));for(int i = 0; i != maxValue+1; ++i)CountArray[i] = 0;for(int i = 0; i != ArrayLength; ++i)CountArray[(CmpArray[i])]++;for(int i = 1; i != maxValue+1; ++i)CountArray[i] += CountArray[i-1];for(int i = ArrayLength-1; i != -1; --i){SortedArray[(CountArray[CmpArray[i]])-1]= SortArray[i];CountArray[CmpArray[i]] -= 1;}for(int i = 0; i != ArrayLength; ++i)SortArray[i] = SortedArray[i];free(CountArray);free(SortedArray);}/*****************************************************************************函 数 名  : RadixSort功能描述  : 基数排序利用计数排序算法,对数组从低向高位排序输入参数  : int SortArray[]  int ArrayLength  输出参数  : 无返 回 值  : 调用函数  : 被调函数  : 修改历史      :1.日    期   : 2012年9月1日作    者   : 风痕修改内容   : 新生成函数*****************************************************************************/
void RadixSort(int SortArray[], int ArrayLength)
{int *RadixArray = (int *)malloc(ArrayLength * sizeof(int));int BaseNumber = 1;bool rsIsOk = false;while(false ==rsIsOk){rsIsOk = true;BaseNumber *= 10;for(int i = 0; i != ArrayLength; ++i){RadixArray[i] = SortArray[i] % BaseNumber;RadixArray[i] = RadixArray[i] / (BaseNumber / 10);if(RadixArray[i] > 0)rsIsOk = false;}if(true == rsIsOk)break;CountingSortForRadixSort(SortArray, RadixArray, ArrayLength, 9 );}free(RadixArray);
}/*****************************************************************************
堆: 可以视为一棵完全二叉树,树的每一层都是填满的,除了最后一层*****************************************************************************/
#define PARENT(x)   ((x) >> 1)            // 节点x的父节点下标号
#define LEFT(x)     ((x) << 1)            // 节点x的左子节点下标号
#define RIGHT(x)    (((x) << 1) + 1) // 节点x的右子节点下标号static void MaxHeapify(int SortArray[], int heap_size, int parent)
{int temp;int left, right, largest;left = LEFT(parent+1) - 1;right = RIGHT(parent+1) -1;if(left < heap_size && SortArray[left] > SortArray[parent])largest = left;elselargest = parent;if(right < heap_size && SortArray[right] > SortArray[largest])largest = right;if(largest != parent){swap(SortArray[largest], SortArray[parent], temp);MaxHeapify(SortArray, heap_size, largest);}
}static void BuildMaxHeap(int SortArray[], int ArrayLength)
{int HeapSize = ArrayLength;for(int i = ArrayLength/2; i != -1; --i)MaxHeapify(SortArray,HeapSize,i);
}/*****************************************************************************函 数 名  : HeapSort功能描述  : 堆排序算法堆排序算法主要用于优先级队列输入参数  : int SortArray[]  int ArrayLength  输出参数  : 无返 回 值  : 调用函数  : 被调函数  : 修改历史      :1.日    期   : 2012年9月2日作    者   : 风痕修改内容   : 新生成函数*****************************************************************************/
void HeapSort(int SortArray[], int ArrayLength)
{int temp;int HeapSize = ArrayLength;BuildMaxHeap(SortArray, ArrayLength);for(int i = ArrayLength-1; i !=0; --i){swap(SortArray[0], SortArray[i], temp);HeapSize--;MaxHeapify(SortArray, HeapSize, 0);}
}/*****************************************************************************函 数 名  : GetHeapMaximum功能描述  : 获取最大堆中的最大值输入参数  : int *MaxHeapArray  输出参数  : 无返 回 值  : 调用函数  : 被调函数  : 修改历史      :1.日    期   : 2012年9月2日作    者   : 风痕修改内容   : 新生成函数*****************************************************************************/
int GetHeapMaximum(int *MaxHeapArray)
{return MaxHeapArray[0];
}/*****************************************************************************函 数 名  : ExtractHeapMaximum功能描述  : 去掉并返回队列中最大关键字元素输入参数  : int *MaxHeapArray  int HeapSize       输出参数  : 无返 回 值  : 调用函数  : 被调函数  : 修改历史      :1.日    期   : 2012年9月2日作    者   : 风痕修改内容   : 新生成函数*****************************************************************************/
int ExtractHeapMaximum(int *MaxHeapArray, int HeapSize)
{if(0 == HeapSize)    // 空堆返回0return 0;   int maxValue = MaxHeapArray[0];// 重建堆MaxHeapArray[0] = MaxHeapArray[HeapSize-1];HeapSize--;MaxHeapify(MaxHeapArray, HeapSize, 0);return maxValue;
}/*****************************************************************************函 数 名  : IncreaseHeapKey功能描述  : 将KeyIndex的值增加到Key输入参数  : int *MaxHeapArray  int KeyIndex       int Key            输出参数  : 无返 回 值  : 调用函数  : 被调函数  : 修改历史      :1.日    期   : 2012年9月2日作    者   : 风痕修改内容   : 新生成函数*****************************************************************************/
bool IncreaseHeapKey(int *MaxHeapArray, int KeyIndex, int Key)
{int temp;if(Key < MaxHeapArray[KeyIndex])return false;while(KeyIndex != 0 && MaxHeapArray[PARENT(KeyIndex+1)]<<MaxHeapArray[KeyIndex]){swap(MaxHeapArray[PARENT(KeyIndex+1)],MaxHeapArray[KeyIndex], temp);KeyIndex = PARENT(KeyIndex+1);}if(0 == KeyIndex){swap(MaxHeapArray[0], MaxHeapArray[1], temp);}return false;
}/*****************************************************************************函 数 名  : MaxHeapInsert功能描述  : 向堆中插入元素KeyValue注意,插入元素后堆长度增加,需在调用该函数后增加输入参数  : int HeapArray[]  int HeapSize     int KeyValue     输出参数  : 无返 回 值  : 调用函数  : 被调函数  : 修改历史      :1.日    期   : 2012年9月2日作    者   : 风痕修改内容   : 新生成函数*****************************************************************************/
int MaxHeapInsert(int HeapArray[], int HeapSize, int KeyValue)
{HeapArray[HeapSize] = 0;return IncreaseHeapKey(HeapArray, HeapSize, KeyValue);}
/*****************************************************************************函 数 名  : BucketSort功能描述  : 桶排序将数组中的元素划分到n个大小相同的区间(桶)内,然后对区间内的数使用插入排序,然后再将数组合并输入参数  : 无输出参数  : 无返 回 值  : 调用函数  : 被调函数  : 修改历史      :1.日    期   : 2012年9月1日作    者   : 风痕修改内容   : 新生成函数*****************************************************************************/
void BucketSort()
{}

sort.h

#ifndef _SORT_H
#define _SORT_H
void InsertSort(int *SortArray, int ArrayLength);
void BubbleSort(int *SortArray, int ArrayLength);
void MergeSort(int SortArray[], int start, int end);
void QuickSort(int SortArray[], int start, int end);
void CountingSort(int SortArray[], int SortedArray[], int ArrayLength,int maxValue);
void RadixSort(int SortArray[], int ArrayLength);
void HeapSort(int SortArray[], int ArrayLength);int GetHeapMaximum(int *MaxHeapArray);
int ExtractHeapMaximum(int *MaxHeapArray, int HeapSize);
bool IncreaseHeapKey(int *MaxHeapArray, int KeyIndex, int Key);
int MaxHeapInsert(int HeapArray[], int HeapSize, int KeyValue);#endif

sortTest.cpp

// SortTest.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include <stdlib.h>
#include "sort.h"int _tmain(int argc, _TCHAR* argv[])
{int SortArray1[] = {0,0,9,8,7,6,5,4,3,1,2};int SortArray2[] = {8,9,3,4,5,0,0,6,7,9,8}; //MergeSort(SortArray1, 0, sizeof(SortArray1)/sizeof(int)-1);//MergeSort(SortArray2, 0, sizeof(SortArray2)/sizeof(int)-1);//QuickSort(SortArray1, 0, sizeof(SortArray1)/sizeof(int)-1);//QuickSort(SortArray2, 0, sizeof(SortArray2)/sizeof(int)-1);//int *SortedArray1 = (int *)malloc(sizeof(SortArray1)*sizeof(int));//int *SortedArray2 = (int *)malloc(sizeof(SortArray2)*sizeof(int));//CountingSort(SortArray1, SortedArray1, sizeof(SortArray1)/sizeof(int), 9);//CountingSort(SortArray2, SortedArray2, sizeof(SortArray2)/sizeof(int), 9);//RadixSort(SortArray1,sizeof(SortArray1)/sizeof(int));//RadixSort(SortArray2,sizeof(SortArray2)/sizeof(int));int SortArray3[] = {110,120,129,138,317,6,15,54,33,441,902};int SortArray4[] = {118,129,123,134,325,0,10,56,37,409,8}; //RadixSort(SortArray3,sizeof(SortArray3)/sizeof(int));//RadixSort(SortArray4,sizeof(SortArray4)/sizeof(int));HeapSort(SortArray1,sizeof(SortArray1)/sizeof(int));HeapSort(SortArray2,sizeof(SortArray2)/sizeof(int));HeapSort(SortArray3,sizeof(SortArray3)/sizeof(int));HeapSort(SortArray4,sizeof(SortArray4)/sizeof(int));return 0;
}

排序算法汇总--冒泡,插入,归并,快速,堆,计数,基数,桶排序相关推荐

  1. java冒泡遍历对象_Java经典排序算法(冒泡、选择、插入)

    排序算法说明 排序说明 对一序列对象根据某个关键字进行排序. 术语说明 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面: 不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b ...

  2. 终于,把十大经典排序算法汇总了!(Java实现版)

    转载自  终于,把十大经典排序算法汇总了!(Java实现版) 最近几天在研究排序算法,看了很多博客,发现网上有的文章中对排序算法解释的并不是很透彻,而且有很多代码都是错误的,例如有的文章中在" ...

  3. 排序算法汇总(C/C++实现)

    前言:     本人自接触算法近2年以来,在不断学习中越多地发觉各种算法中的美妙.之所以在这方面过多的投入,主要还是基于自身对高级程序设计的热爱,对数学的沉迷.回想一下,先后也曾参加过ACM大大小小的 ...

  4. 各类排序算法汇总及动画演示(C语言)

    常用排序算法及动画演示 (一)插入排序 插入排序可形象理解为打扑克时理牌的一个过程,具体分为直接插入.折半插入排序.希尔排序三种: ①直接插入排序 void InsertSort(int a[],in ...

  5. php递归算法排序,php常用的排序算法代码[冒泡,递归排序-PHP源码

    <script>ec(2);<script> php 常用的排序算法代码[冒泡,递归排序 冒泡排序算法 function bubblesort($arr) { $n=count ...

  6. 排序算法之冒泡算法的讲解以及此算法的优缺点

    **排序算法之冒泡算法的讲解以及此算法的优缺点** **冒泡排序算法是非常常见的一种排序算法,通常用于对数组元素的排序,究竟什么是冒泡排序? ** 一桶水中如果气泡共同处在一个维度或者说处在同一个水平 ...

  7. 排序算法java 简书_史上最全经典排序算法总结(Java实现)

    查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中.因为其实现代码较短,应用较常见.所以在面试中经常会问到排序算法及其相关的问题.但万变不离其宗,只要熟悉了思想,灵活运用也不是难事.一般在 ...

  8. C++实现十大排序算法(冒泡,选择,插入,归并,快速,堆,希尔,桶,计数,基数)排序算法时间复杂度、空间复杂度、稳定性比较(面试经验总结)

    排序算法分类 内部排序算法又分为基于比较的排序算法和不基于比较的排序算法,其分类如下: 比较排序:   直接插入排序    希尔排序 (插入)  冒泡排序     快速排序  (交换) 直接选择排序  ...

  9. 排序入门的七种算法(冒泡—插入—希尔—堆—选择—归并—快速)

    ---------文中的部分代码思路参考自<大话数据结构>一书. 目录 冒泡排序 插入排序 希尔排序 堆排序 选择排序 归并排序 快速排序 冒泡排序 原始的冒泡排序是对整个序列相邻两数字间 ...

最新文章

  1. 深入理解 Linux 的 epoll 机制
  2. 库函数strlen源码重现及注意问题
  3. STM 软件事务内存——本质是为提高并发,通过事务来管理内存的读写访问以避免锁的使用...
  4. 在新版本caffe里添加新的一层(向旧格式中加)
  5. 鸿蒙适配倒计时,华为鸿蒙OS2.0手机系统定档 鸿蒙OS2.0上线倒计时
  6. Google 又逆天:语音输入离线实时输出文字,仅占 80 MB !然而……
  7. Web Components 系列(五)—— 关于 Templates
  8. 【被C折腾系列】用C调DIOCP编码客户端通信
  9. Java集合框架源码解读(4)——WeakHashMap
  10. 【Python成长之路】共享平台
  11. 关于蓝天准系统换京东方屏后不显bios的解决方案
  12. 社会工程学案例调研和研究
  13. usb无线网卡断线后找不到网络
  14. (纪中)2173. 无根树(tree)【SPFA】
  15. 手机状态信息里的IP地址和通过浏览器ip.cn查到的IP地址区别
  16. 2021年日本互联网服务业发展现状:ZHD和LINE 的合并将改变日本互联网行业格局[图]
  17. CWnd::FromHandle与CWnd::FromHandlePermanent有什么区别
  18. Python创建文件夹和子文件夹
  19. java软件测试基础
  20. 使用Python工具包Openpyxl进行Excel处理

热门文章

  1. 【ffmpeg】编译及使用外部的编解码器
  2. 通信原理包络是什么意思_通信原理复试问题准备
  3. Deciphering Malware‘s use of TLS (without Decryption)阅读笔记
  4. 公司创建初期,用哪个企业邮箱好?
  5. 量化投资01----股票_贵州茅台600519_双均线策略回测
  6. 新生儿(早产)婴儿护理行业调研报告 - 市场现状分析与发展前景预测
  7. 让 wls 拥有可视化功能
  8. 0304 直播报名|向量索引算法介绍与优化
  9. ATSHA204A-MAHDA-T国产替代加密芯片
  10. 《网络编程》基本 UDP 套接字编程