十种排序算法:

  • 选择排序
  • 插入排序
  • 冒泡排序
  • 希尔排序
  • 快速排序的三种实现方法
  • 归并排序
  • 堆排序(大顶堆)
  • 计数排序
  • 基数排序(待实现)
  • 桶排序(待实现)
#include <bits/stdc++.h>
using namespace std;
void MergeSubQ(int a[], int n, int p, int middle, int r);
int Partition01(int a[], int p, int r);
int Partition02(int a[], int p, int r);
int* Partition03(int a[], int p, int r);
void InitializeHeap(int a[], int n, int i);//选择排序 O(n^2)
void SelectSort(int a[], int n){for(int i=0; i<n-1; i++){int mmin=a[i];int index=i;for(int j=i+1; j<n; j++){if(a[j]<mmin){mmin=a[j];index=j;}}int temp = a[i];a[i] = a[index];a[index] = temp;}
}//冒泡排序  O(n^2)
void BubbleSort(int a[], int n){for(int i=0; i<n-1; i++)for(int j=0; j<n-i-1; j++){if(a[j]>a[j+1]){int temp = a[j];a[j] = a[j+1];a[j+1] = temp;}}}
//插入排序  O(n^2)
void InsertSort(int a[], int n){for(int i=0; i<n; i++){int num = a[i];int index = i-1;while(index>-1 && num<a[index]){a[index+1] = a[index];index--;}a[index+1] = num;}
}//希尔排序 O(n^1.3)
void ShellSort(int a[], int n){for(int interval=n/2; interval>=1; interval/=2){for(int i=interval; i<n; i++){int num = a[i];int index = i-interval;while(index>-1 && num<a[index]){a[index+interval] = a[index];index-=interval;}a[index+interval] = num;}}
}//归并排序
void MergeSort(int a[], int n, int p, int r){if(p<r){int middle = p+((r-p)>>1);//递归求解子问题MergeSort(a, n, p, middle);MergeSort(a, n, middle+1, r);//合并MergeSubQ(a, n, p, middle, r);}
}
void MergeSubQ(int a[], int n, int p, int middle, int r){int help[n];//辅助数组for(int i=0; i<n; i++)help[i] = a[i];int left = p;//左指针int right = middle+1;//右指针int index=p;//当前要放入的位置while(left<=middle && right<=r){if(help[left]<=help[right]){ //左指针指向的元素较小,插入到a中a[index++] = help[left];left++;}if(help[left]>help[right]){ //右指针指向的元素较小,插入到a中a[index++] = help[right];right++;}}while(left<=middle){ //左部分还有剩余,直接插入a的末尾a[index++]=help[left];left++;}
}
//快速排序
void QuickSort(int a[], int p, int r){if(p<r){//找到主元应在的位置int* b = Partition03(a, p, r);//递归求解主元的左部分和右部分QuickSort(a, p, b[0]-1);QuickSort(a, b[1]+1, r);}
}
int Partition01(int a[], int p, int r){ //单向扫描法int point = a[p]; //主元int scan = p+1; //扫描指针,指向主元后int bigger = r;  //指向末尾while(scan<bigger+1){if(a[scan]>point){ //扫描到了比主元大的元素int temp = a[scan]; //与bigger指向的后面的元素进行交换a[scan] = a[bigger];a[bigger] = temp;bigger--;}else //小于等于主元情况scan++;}a[p] = a[bigger]; //将主元放到正确位置a[bigger] = point;return bigger;
}
int Partition02(int a[], int p, int r){ //双指针int point = a[p];int left = p+1; //从左扫描int right = r;  //从右扫描while(left<=right){while(left<=r && a[left]<point){left++;}while(right>=p+1 && a[right]>point){right--;}if(left<=right){int temp = a[left];a[left] = a[right];a[right] = temp;}}a[p] = a[right];a[right] = point;return right;
}
int* Partition03(int a[], int p, int r){ //重复元素过多时int point = a[p];int scan = p+1;int eq = p+1; //找重复int bigger = r;int flag=false;while(scan<=bigger){if(a[scan]<point){if(flag){int temp = a[scan];a[scan] = a[eq];a[eq] = temp;eq++;}scan++;}else if(a[scan]==point){ //相当时,将eq指向第一个相等的元素if(!flag){eq = scan;flag=true;}scan++;}else{int temp = a[scan];a[scan] = a[bigger];a[bigger] = temp;bigger--;}}if(!flag)eq=bigger;a[p] = a[bigger]; //bigger最后指向的是主元的位置a[bigger] = point;int b[2] = {eq, bigger}; //返回两个值return b;
}
//堆排序
void HeapSort(int a[], int n){//初始化堆for(int x=n/2; x>=0; x--)InitializeHeap(a, n, x);//进行排序for(int x=n-1; x>=0; x--){int temp = a[0];a[0] = a[x];a[x] = temp;InitializeHeap(a, x, 0);}}
void InitializeHeap(int a[], int n, int i){int left = 2*i+1;int right = 2*i+2;int maxIndex = left;if(left>=n)return ;if(right>=n){maxIndex = left;}else{if(a[right]>a[left])maxIndex=right;}if(a[i]>=a[maxIndex])return ;int temp = a[i];a[i] = a[maxIndex];a[maxIndex] = temp;InitializeHeap(a, n, maxIndex);
}
//基数排序
void BaseSort(int a[], int n){}//计数排序
void CountSort(int a[], int n){int mmax = a[0];for(int i=1; i<n; i++){ //找出数组中的最大值if(a[i]>mmax)mmax = a[i];}int help[mmax+1];memset(help, 0, sizeof(help));for(int i=0; i<n; i++){  //计数help[a[i]]++;}int index = 0;for(int i=1; i<mmax+1; i++){ //根据数的个数排序while(help[i]>0){a[index++] = i;help[i]--;}}
}//桶排序int main(){int a[10];srand((int)time(0));for(int i=0; i<10; i++)a[i] = rand() % 100;SelectSort(a, 10);BubbleSort(a, 10);InsertSort(a, 10);ShellSort(a, 10);MergeSort(a, 10, 0, 9);QuickSort(a, 0, 9);HeapSort(a, 10);CountSort(a, 10);for(int i=0; i<10; i++)cout<<a[i]<<" ";return 0;
}

eq值 推荐算法_C++实现十种排序算法相关推荐

  1. c语言排序算法_C语言写排序算法(二) —— 选择排序

    上次联系的算法是冒泡排序,不知道小伙伴们还记得不,中间穿插了一下比特币相关的分享,嘿嘿.今天来分享一下选择排序. 算法描述:选择排序是从数组中选择最大(小)的元素放到数组的最后一个,然后往前移,接着从 ...

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

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

  3. 经典的十种排序算法 C语言版

    经典的十种排序算法(C语言版) 1.冒牌排序 冒牌排序的特点 ​ 一趟一趟的比较待排序的数组,每趟比较中,从前往后,依次比较这个数和下一个数的大小,如果这个数比下一个数大,则交换这两个数,每趟比较后, ...

  4. 机器学习(二十二)——推荐算法中的常用排序算法, Tri-training

    推荐算法中的常用排序算法 Pointwise方法 Pranking (NIPS 2002), OAP-BPM (EMCL 2003), Ranking with Large Margin Princi ...

  5. 排序算法 - 面试中的排序算法总结

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

  6. 排序算法:简单选择排序算法实现及分析

    简单选择排序算法介绍 简单选择排序(Simple Selection Sort)就是通过n-1次关键字排序之间的比较,从n-i+1个记录中选择关键字最小的记录,并和第i(1<=i<=n)记 ...

  7. 《数据结构与算法》实验:排序算法实验比较——选择排序 堆排序

    <数据结构与算法>实验和课程Github资源 <数据结构与算法>实验:线性结构及其应用--算术表达式求值 <数据结构与算法>实验:树型结构的建立与遍历 <数据 ...

  8. 算法 经典的八大排序算法详解和代码实现

    算法 经典的八大排序算法详解和代码实现 排序算法的介绍 排序的分类 算法的时间复杂度 时间频度 示例 图表理解时间复杂度的特点 时间复杂度 常见的时间复杂度 空间复杂度 排序算法的时间复杂度 冒泡排序 ...

  9. 算法基础-十大排序算法及其优化(文末有抽奖福利哦)

    算法基础-十大排序算法及其优化 算法基础-十大排序算法及其优化 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Kw1LA5Q4-1607527572080)(/uplo ...

最新文章

  1. CSS将长文字换行的方法 (转)
  2. linux获取近一小时日志,Linux分析日志获取最多访问的前10个IP
  3. 三、const常量声明方式
  4. 超大数据下大批量随机键值的查询优化方案 1
  5. RuntimeError: maximum recursion depth exceeded
  6. python【蓝桥杯vip练习题库】ALGO-86矩阵乘法(枚举)
  7. oracle查看被锁的行,查找被锁的表到底是哪一行被锁定了
  8. mysql 各个版本驱动jar包
  9. 字符串php手册,php知识点复习之字符串
  10. Vue 模块化开发(构建项目常用工具)
  11. sperling指标 matlab,sperling指标计算实验报告
  12. HTML5标准学习 – 简介
  13. 统计通话次数和时间的软件_通话时间统计app下载-通话时间统计v2.5 安卓版-腾牛安卓网...
  14. TwinCAT3 控制器PLC之间EAP通讯2-从机发送方式1
  15. 什么是域名系统DNS
  16. Liang-GaRy啃linux书想吐(五)
  17. 阿里巴巴国际站Dropshipping模式探索
  18. 检索的原理和方法步骤
  19. Web前端之jQuery 一
  20. 几行JS代码防止网站在QQ和微信被举报

热门文章

  1. python开发转行做数据分析_转行学IT,Java、Python、大数据选择学哪个发展好?
  2. html 360不识别,html 为什么在ie里显示正常在360浏览器不正常呢?
  3. md5会重复吗_如何优雅地处理重复请求(并发请求)
  4. 绳索受力分析的软件_【硕士论文】供热管网管道支架载荷分析与优化设计
  5. 猎豹浏览器怎么查看历史记录 猎豹浏览器历史记录查看教程
  6. 深度技术win11 32位全新专业版系统v2021.07
  7. 腾讯视频怎么退出青少年守护模式
  8. ajax 405报错,使用ajax请求时发生随机HTTP错误405
  9. SpringBoot——实现WebService接口服务端以及客户端开发
  10. Spring 是如何解决循环依赖的?