目录

  • 算法性能总结
  • 1、冒泡排序
  • 2、选择排序
  • 3、插入排序
  • 4、希尔排序
  • 5、归并排序
  • 6、快速排序
  • 7、计数排序
  • 8、桶排序
  • 9、基数排序
  • 10、堆排序

算法性能总结

1、冒泡排序

//1、Bubble Sort 冒泡排序
void bubbleSort(int a[], int length)
{if (length < 2)return;for (int i = 0; i < length - 1; i++) //需length-1趟排序确定后length-1个数,剩下第一个数不用排序;{for (int j = 0; j < length - 1 - i; j++){if (a[j + 1] < a[j]){int temp = a[j + 1];a[j + 1] = a[j];a[j] = temp;}}}
}

2、选择排序

//2、Select Sort 选择排序
void selectSort(int a[], int length)
{if (length < 2)return;for (int i = 0; i < length; i++){int minIndex = i;for (int j = i + 1; j < length; j++) //已确定a[0]~a[i-1],从i-1开始查找最小的数,然后与a[i]交换位置;{if (a[j] < a[minIndex])minIndex = j;}int temp = a[i];a[i] = a[minIndex];a[minIndex] = temp;}
}

3、插入排序

//3、Insert Sort 插入排序
void insertSort(int a[], int length)
{if (length < 2)return;for (int i = 1; i < length; i++) //现在进行插入的是a[i]{int cur = a[i];int j = i;while (j > 0 && a[j - 1] > cur) //如果前面的数比cur,说明cur要插在它们前面,即将它们后移一个位置;{a[j] = a[j - 1];j--;}a[j] = cur;}
}

4、希尔排序

//4、Shell Sort 希尔排序
void shellSort(int a[], int length)
{if (length < 2)return;int gap = length / 2; //整个数组分为gap个组,即每隔 gap-1 个位置的元素为一组while (gap > 0)       //最终整个数组分为一组 即所有元素为一组;{for (int i = gap; i < length; i++){int cur = a[i];int preIndex = i - gap;while (preIndex >= 0 && a[preIndex] > cur) //对每一组元素进行插入排序{a[i] = a[preIndex];preIndex -= gap;}a[preIndex + gap] = cur;}gap /= 2;}
}

5、归并排序

//5、Merge Sort 归并排序
void merge(int a[], int left, int mid, int right);void mergeSort(int a[], int left, int right) //  left需要排序数组 a[] 的左端下标,right为右端下标
{int length = right - left + 1;if (length < 2)return;int mid = (right + left) / 2;mergeSort(a, 0, mid);mergeSort(a, mid + 1, right);merge(a, left, mid, right); //调用merge函数 将二者合并
}void merge(int a[], int left, int mid, int right) //将数组a 的两个子数组a[left] ~ a[mid] 与 a[mid+1] ~ a[right] 合并
{int len = right - left + 1;vector<int> temp;int i = left, j = mid + 1;for (; i <= mid && j <= right;){if (a[i] < a[j]){temp.push_back(a[i]);i++;}else{temp.push_back(a[j]);j++;}}while (i <= mid)temp.push_back(a[i++]); //此时必有一个子数组没有走完 需要把剩下的元素全部放进vectorwhile (j <= right)temp.push_back(a[j++]);for (int i = left, k = 0; i <= right; i++) //把vector中已排完序的元素存入数组a[left]~a[right]{a[i] = temp[k++];}
}

6、快速排序

//6、Quick Sort 快速排序
void quickSort(int a[], int left, int right)
{if (left >= right)return;int key = a[left]; //以第一个数为基数进行快排;int pointL = left, pointR = right;while (pointL < pointR){//一定要先动右指针,否则右指针所指向的元素无处存放while (pointR > pointL && a[pointR] >= key) //若右指针指向的元素大于key 则右指针左移,直到右指针指向的元素小于key 或者 左右指针坐标相同pointR--;a[pointL] = a[pointR]; //把这个小于key的元素放到key的左边,即左指针指向的位置while (pointR > pointL && a[pointL] <= key) //若左指针指向的元素小于key 则左指针右移,直到左指针指向的元素大于key 或者 左右指针坐标相同pointL++;a[pointR] = a[pointL]; //把这个大于key的元素放到key的右边,即右指针指向的位置}a[pointR] = key; //此时左右指针指向同一位置,这个位置就是key应该放的位置//对key两边的元素同样使用快排quickSort(a, left, pointR - 1);quickSort(a, pointR + 1, right);
}

7、计数排序

//7、Counting Sort 计数排序
void countingSort(int a[], int length)
{if (length < 2)return;int min = a[0], max = a[0];int bios; //偏移量for (int i = 0; i < length; i++) //找最大最小值{if (a[i] < min)min = a[i];if (a[i] > max)max = a[i];}bios = 0 - min;vector<int> temp(max - min + 1, 0);for (int i = 0; i < length; i++) //把出现了的元素作为temp的下标 并置1;{temp[a[i] + bios]++;}int index = 0;for (int i = 0; i < max - min + 1; i++) //顺序扫描以便vector即可{while (temp[i]){a[index++] = i - bios;temp[i]--;}}
}

8、桶排序

//8、Bucket Sort 桶排序
void bucketSort(int a[], int length)
{if (length < 2)return;int min = a[0], max = a[0];for (int i = 0; i < length; i++){if (a[i] < min)min = a[i];if (a[i] > max)max = a[i];}int buckNum = (max - min) / length + 1; //桶的数量vector<vector<int>> bucketArr;for (int i = 0; i < buckNum; i++){vector<int> temp;bucketArr.push_back(temp);}//每个元素入桶for (int i = 0; i < length; i++){int num = (a[i] - min) / length;bucketArr[num].push_back(a[i]);}//对每个桶排序 并且排序完后赋值int index = 0;for (int i = 0; i < bucketArr.size(); i++){if (bucketArr[i].size()){sort(bucketArr[i].begin(), bucketArr[i].end()); //快排for (int j = 0; j < bucketArr[i].size(); j++){a[index++] = bucketArr[i][j];}}}
}

9、基数排序

//9、Base Sort 基数排序
void baseSort(int a[], int length)
{//得到最大位数;int max = a[0];int d = 0;//最大位数for (int i = 0; i < length; i++){if (a[i] > max)max = a[i];}while (max){max /= 10;d++;}int factor = 1;for (int i = 1; i <= d; i++) //从个位数排到d位数{vector<int> bucket[10]; //初始化十个桶for (int i = 0; i < length; i++){int temp = (a[i] / factor) % 10; //得到a[i]的now_d位数,并放入对应桶中bucket[temp].push_back(a[i]);}int j = 0;for (int i = 0; i < 10; i++) //遍历十个桶,按从小到大顺序放入原数组{int size = bucket[i].size();for (int k = 0; k < size; k++){a[j++] = bucket[i][k];}bucket[i].clear(); //桶置空}factor *= 10;}
}

10、堆排序

//10、Heap Sort 堆排序   大顶堆做出来顺序,小顶堆做出来逆序
void fixDown(int a[], int i, int length);
void swap(int a[], int i, int j);void heapSort(int a[], int length)
{//先对 a 堆化for (int i = length / 2 - 1; i >= 0; i--) // 完成后 此时a已经是合法的小顶堆{fixDown(a, i, length); //把i当前小顶堆的根节点}//调整堆结构for (int x = length - 1; x > 0; x--){//把堆顶元素(0号元素)和末尾元素对调;swap(a, 0, x);//缩小堆的范围,对堆顶元素进行向下调整;fixDown(a, 0, x);}
}void fixDown(int a[], int i, int length)
{//找到左右子孩子int left = 2 * i + 1;int right = 2 * i + 2;int min = left;     //min指向左右孩子中较小的那个if (left >= length) //若左孩子越界则右孩子必越界return;if (right < length && a[right] < a[left]) //右孩子越界或者右孩子值比左孩子小min = right;//如果a[i]比这两个孩子的值都要小,则不用调整;if (a[i] < a[min])return;//否则,其值和a[i]交换;swap(a, i, min);//小孩子那个位置的值发生变化,i变更为小孩子的那个位置,于是递归调整;fixDown(a, min, length);
}
void swap(int a[], int i, int j)
{int temp = a[i];a[i] = a[j];a[j] = temp;
}
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;//1、Bubble Sort 冒泡排序
void bubbleSort(int a[], int length);
//2、Select Sort 选择排序
void selectSort(int a[], int length);
//3、Insert Sort 插入排序
void insertSort(int a[], int length);
//4、Shell Sort 希尔排序
void shellSort(int a[], int length);
//5、Merge Sort 归并排序
void merge(int a[], int left, int mid, int right);
void mergeSort(int a[], int left, int right) ;
//6、Quick Sort 快速排序
void quickSort(int a[], int left, int right);
//7、Counting Sort 计数排序
void countingSort(int a[], int length);
//8、Bucket Sort 桶排序
void bucketSort(int a[], int length);
//9、Base Sort 基数排序
void baseSort(int a[], int length);
//10、Heap Sort 堆排序   大顶堆做出来顺序,小顶堆做出来逆序
void fixDown(int a[], int i, int length);
void swap(int a[], int i, int j);
void heapSort(int a[], int length)int main()
{int a[8] = {3, 1, 5, 4, 5, 8, 7, 10};// bubbleSort(a, 8);// selectSort(a,8);// insertSort(a, 8);// shellSort(a, 8);// mergeSort(a, 0, 7);// quickSort(a, 0, 7);// countingSort(a, 8);// bucketSort(a, 8);// baseSort(a, 8);heapSort(a, 8);for (int i = 0; i < 8; i++)cout << a[i] << ' ';return 0;
}

如有错误,欢迎评论指正,谢谢!

Algorithm:十大经典排序算法C++实现及总结相关推荐

  1. Algorithm:【Algorithm算法进阶之路】之十大经典排序算法

    Algorithm:[Algorithm算法进阶之路]之十大经典排序算法 相关文章 Algorithm:[Algorithm算法进阶之路]之数据结构二十多种算法演示 Algorithm:[Algori ...

  2. 教小学妹学算法:十大经典排序算法深度解析

    最近有一位小学妹 Coco 入坑了算法,结果上来就被几个排序算法给整懵逼了,各种排序眼花缭乱,也分不清什么时候该用什么排序了. 今天呢,就在这分享一下我给小学妹讲十大经典排序算法的过程. 好吧,那我们 ...

  3. C++实现桶排序——十大经典排序算法之九【GIF动画+完整代码+详细注释】

    十大经典排序算法系列博客-->传送门 桶排序是计数排序的升级版.它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定.桶排序 (Bucket sort)的工作的原理:假设输入数据服从均 ...

  4. 算法 - 十大经典排序算法(动图演示)

    [TOC] 算法 - 十大经典排序算法(动图演示) ​ 在计算机科学与数学中,一个排序算法(英语:Sorting algorithm)是一种能将一串资料依照特定排序方式进行排列的一种算法.最常用到的排 ...

  5. 十大经典排序算法动画与解析,看我就够了

    作者 | 程序员小吴 转载自五分钟学算法(ID: CXYxiaowu) 排序算法是<数据结构与算法>中最基本的算法之一. 排序算法可以分为内部排序和外部排序.内部排序是数据记录在内存中进行 ...

  6. 十大经典排序算法(建议收藏)

    来自:Damonare的个人博客 原文:http://blog.damonare.cn/2016/12/20/十大经典排序算法总结(javascript描述)/ 0.算法概述  0.1 算法分类 十种 ...

  7. 11月14日云栖精选夜读 | 动画+原理+代码,解读十大经典排序算法

    排序算法是<数据结构与算法>中最基本的算法之一. 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过 ...

  8. python经典排序_python实现十大经典排序算法

    写在前面 本文参考十大经典排序算法(动图演示),这篇文章有动图显示,介绍的很详细.本文是部分内容有借鉴此博客,用python实现,有一些改进. 各种算法的时间.空间复杂度 1.冒泡排序 1.比较相邻的 ...

  9. 十大经典排序算法总结(够兄弟们喝一壶的)

    Ⅰ.十大经典排序算法之插入排序及其二分优化:https://blog.csdn.net/Kevinnsm/article/details/114403557 Ⅱ.十大经典排序算法之冒泡排序及其优化:h ...

  10. 【完整可运行源码+GIF动画演示】十大经典排序算法系列——冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序

    以前也零零碎碎发过一些排序算法,但总是不系统, 这次彻底的对排序系列做了一个整体的规划, 小伙伴们快快mark哦~ [GIF动画+完整可运行源代码]C++实现 冒泡排序--十大经典排序算法之一 [GI ...

最新文章

  1. 怕了么?三年后,人工智能将彻底改变前端开发?
  2. 参加51CTO培训,PMP考试通过啦
  3. Typescript + TSLint + webpack 搭建 Typescript 的开发环境
  4. 去哪里学习python_Python从哪里开始学?怎么入门?
  5. 安卓USB开发教程 五 安卓 AOA 1.0
  6. 【数据库】Mysql函数DATE_FORMAT() 显示日期/时间
  7. MVVM是什么?谈谈你对MVVM的理解?
  8. wordpress制作主题之菜单
  9. oracle sqlplus客户端,sqlplus下载|oracle sqlplus windows 客户端工具 64位下载 - 3322软件站...
  10. jqGrid分页点击事件,点击分页的时候滚动条回到顶端
  11. python爬虫实践-腾讯视频弹幕分析
  12. 第七章产品生命周期管理
  13. 2016年农民工监测调查报告(zz)
  14. 自定义的毛玻璃效果,高斯模糊
  15. Excel怎么快速提取出网址
  16. VSCode改主题背景
  17. LCD模块加载启动分析
  18. [入门篇]Linux操作系统fork子进程的创建以及进程的状态 超超超详解!!!我不允许有人错过!!!
  19. 人工智能和AI到底是什么,浅谈人工智能和AI
  20. 蚂蚁金服有哪些金融特色的机器学习技术?

热门文章

  1. c语言是如何实现泛型链表
  2. MySQL字符串转日期
  3. watir-webdriver使用过程中异常
  4. simple_html_dom.php 使用 乱码处理作者:gaoming13
  5. Linux架构之NFS共享存储1
  6. 微服务之SpringCloud实战(五):SpringCloud Eureka详解
  7. python第一个程序--hello world
  8. jquery选择器通配符
  9. 第一次作业--四则运算
  10. Android ADB 用法