2018 3 17

今日总结一下C++中的排序算法:

1冒泡排序

它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端。(来源百度百科)
C++实现:
 #include "stdafx.h"
#include <iostream>
using namespace std;
int ha[] = {,,,,,,,}; template <typename T>
void Bubble_Sort(T *pDst,const int nLen)
{
int cycle;
//外层循环,控制遍历的次数(N-1(N为待排序的数组大小))
for (cycle=; cycle<(nLen-) ; cycle++)
{
//内层循环,每次遍历到前一次最大值之前为止
for (int i=; i < (nLen - -cycle); i++)
{
if (pDst[i] > pDst[i + ])
{
T tTemp = pDst[i];
pDst[i] = pDst[i + ];
pDst[i + ] = tTemp;
}
}
}
} int main()
{
//冒泡 Bubble_Sort<int>(ha,);
for (int i = ; i < ; i++)
{
printf("%d-",ha[i]);
     getchar();
}
36   return ;
}

2 选择排序

  工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。

C++实现:

 //升序
template <typename T>
void Select_Sort(T *pDst, const int nLen)
{
T tTemp; //遍历nLen次,每次找到最小的值,交换
for (int i = ; i < nLen; i++)
{
for (int j = i; j < nLen; j++)
{
if (pDst[j] <pDst[i])
{
tTemp=pDst[i];
pDst[i] = pDst[j];
pDst[j] = tTemp; }
else
continue;
}
} }
int main()
{
//冒泡 //Bubble_Sort<int>(ha,8);
Select_Sort<int>(ha,);
for (int i = ; i < ; i++)
{
printf("%d-",ha[i]);
}
return ;
}

3 归并排序

将两个有序(同一种序)的数组合并为一个有序数组

(1)二路归并。二路归并的最好情况时间复杂度为:O(Min{sizof(a),sizeof(b)})

 // ConsoleApplication4.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include "atlstr.h"
#include <iostream>
#include <vector>
using namespace std;
//////
//二路归并排序。将两个表,合并成一个表的过程称为二路归并
//如:对两个y有序的数组 进行二路归并
const int a[] = {,,};
const int b[] = {,,,,,,}; int* Merger_Sort(const int *a,const int *b,int nLen1,int nLen2)
{
int *pDst = new int[nLen1+nLen2];
int k = ;
int i = ;
int j = ;
while (i < nLen1&&j < nLen2)
{
if (a[i] <= b[j])
{
pDst[k] = a[i];
i++;
}
else
{
pDst[k] = b[j];
j++;
}
k++;
}
while (i < nLen1)
{
pDst[k] = a[i];
i++;
k++;
}
while (j < nLen2)
{
pDst[k] = b[j];
j++;
k++;
}
return pDst;
} int main()
{
int *p = NULL;
p = Merger_Sort(a,b,,);
for (int i = ; i <; i++)
{
cout << p[i];
}
delete[] p; getchar();
return ;
}

(2) 普通归并排序 ;将二路归并扩展到一般情况,将一个序列分为N组,每组都是一个有序的数组,对两两之间进行归并

 // ConsoleApplication7.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
//二路归并的前提是两个结构的元素已经是有序的(同样的顺序)
int a[] = { ,,,, };
int b[] = { ,,,,, };
void Two_MergeSort(int *pA1, int *pA2, int nA1Len, int nA2Len, int *pOut)
{
int i = ; int j = ;
int nDstPos = ;
while (i < nA1Len&&j < nA2Len)
{
if (pA1[i] > pA2[j])
{
//找到同一顺序的元素中较小的放入pOut中
pOut[nDstPos++] = pA2[j++];
}
else
pOut[nDstPos++] = pA1[i++];
}
while (i < nA1Len)
{
pOut[nDstPos++] = pA1[i++];
}
while (j<nA2Len)
{
pOut[nDstPos++] = pA2[j++];
}
} //输入的Pos指的是坐标,可以比较一下与二路归并的区别
void General_Two_MergeSort(int *pA, int nStartPos, int nMidPos, int nEndPos, int *pOut)
{
int i = nStartPos;
int j = nMidPos + ;
int k = nEndPos;
int nDstPos = nStartPos;
printf("对区间[%d,%d]和区间[%d,%d]进行排序\n", nStartPos, nMidPos, nMidPos + , nEndPos);
while (i <= nMidPos&&j <= nEndPos)
{
if (pA[i] > pA[j])
{
pOut[nDstPos++] = pA[j++];
}
else
{
pOut[nDstPos++] = pA[i++];
}
}
while (i <= nMidPos)
{
pOut[nDstPos++] = pA[i++];
}
while (j <= nEndPos)
{
pOut[nDstPos++] = pA[j++];
}
for (int n = nStartPos; n <= nEndPos; n++)
{
pA[n] = pOut[n];
}
static int nCount = ;
printf("第%d次调用\n",++nCount);
//printf("参数分别是:StartPos:%d,MidPos:%d,EndPos:%d\n", nStartPos,nMidPos,nEndPos);
//printf("当前排序的成员有%d个,分别是:\n",nEndPos-nStartPos+1);
for (int n = nStartPos; n <= nEndPos; n++)
{
printf("%d ",pOut[n]);
}
printf("\n");
printf("\n");
printf("\n");
} //推广到更普通的归并排序
//归并排序的核心是将一串数字中的数字分成两组,先对分成的每一组进行深度归并,最后再对初始的两组进行归并
void Merge_Sort(int *pA, int nLow, int nHigh, int *pOut)
{
if (nLow < nHigh)
{
int nMid = (nLow + nHigh) / ;
//左边递归,直到只含有一个元素
Merge_Sort(pA, nLow, nMid, pOut);
//右边递归,直到只含有一个元素
Merge_Sort(pA, nMid + , nHigh, pOut);
//对两个元素进行递归排序
General_Two_MergeSort(pA, nLow, nMid, nHigh, pOut);
} } int main()
{
int c[] = { };
int Dst[] = { ,,,,,, };
//Two_MergeSort(a,b,5,6,c);
Merge_Sort(Dst, , , c);
int i = ;
while (i < )
{
printf("%d ", c[i++]);
} getchar();
return ;
}

C++/C实现各种排序算法(持续更新)--冒泡排序,选择排序,归并排序的更多相关文章

  1. 常见排序算法总结分析之选择排序与归并排序-C#实现

    本篇文章对选择排序中的简单选择排序与堆排序,以及常用的归并排序做一个总结分析. 常见排序算法总结分析之交换排序与插入排序-C#实现是排序算法总结系列的首篇文章,包含了一些概念的介绍以及交换排序(冒泡与 ...

  2. 排序算法c语言描述---选择排序

    排序算法系列学习,主要描述冒泡排序,选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等排序进行分析. 文章规划: 一.通过自己对排序算法本身的理解,对每个方法写个小测试程序. 具体思路分析 ...

  3. 算法 排序lowB三人组 冒泡排序 选择排序 插入排序

    参考博客:基于python的七种经典排序算法   [经典排序算法][集锦]     经典排序算法及python实现 首先明确,算法的实质 是 列表排序.具体就是操作的列表,将无序列表变成有序列表! 一 ...

  4. 排序算法Java实现(选择排序)

    算法描述:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他记录进行第二轮比较,得到最小的记录并与第二个记录进行位置交换:重复 ...

  5. 排序算法lowb三人组-选择排序

    def get_min_pos(li): min_pos = 0 for i in range(1, len(li)): if li[i] < li[min_pos]: min_pos = i ...

  6. Java排序算法(二):简单选择排序

    [基本思想] 在要排序的一组数中.选出最小的一个数与第一个位置的数交换:然后在剩下的数中再找出最小的与第二个位置的数交换,如此循环至倒数第二个数和最后一个数比較为止. 算法关键:找到最小的那个数.并用 ...

  7. Java排序算法(二)选择排序

    一.测试类SortTest import java.util.Arrays; public class SortTest { private static final int L = 20; publ ...

  8. 排序算法(sorting algorithm) 之 选择排序(selection sort)

    https://en.wikipedia.org/wiki/Selection_sort loop1: 4,6,1,3,7 -> 4,6,1,3,7 4,6,1,3,7 -> ,3,7 1 ...

  9. Python实现八大排序算法(转载)+ 桶排序(原创)

    插入排序 核心思想 代码实现 希尔排序 核心思想 代码实现 冒泡排序 核心思想 代码实现 快速排序 核心思想 代码实现 直接选择排序 核心思想 代码实现 堆排序 核心思想 代码实现 归并排序 核心思想 ...

  10. python算法(一)基本知识&冒泡排序&选择排序&插入排序

    本节内容: 算法基本知识 冒泡排序 选择排序 插入排序 1. 算法基本知识 1.1 什么是算法? 算法(algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为 ...

随机推荐

  1. WinCE中断结构分析

    前一段时间研究了一下WinCE下的中断结构,整理了一下,希望与大家讨论. 最下面有PDF版本下载,便于保存 版权申明:本文版权归ARMCE所有,转载请保留所有原文内容及 ARMCE标识并注明出 自 A ...

  2. linux内核原子变量与原子位操作API

    原子变量: arch/arm/include/asm/atomic.h 定义并初始化 atomic_t v = ATOMIC_INIT(0); 写 void atomic_set(atomic_t * ...

  3. fastDFS与java整合文件上传下载

    准备 下载fastdfs-client-java源码 源码地址 密码:s3sw 修改pom.xml 第一个plugins是必需要的,是maven用来编译的插件,第二个是maven打源码包的,可以不要. ...

  4. IT轮子系列(四)——使用Jquery+formdata对象 上传 文件

    前言 在MVC 中文件的上传,一般都采用控件: <h2>IT轮子四——文件上传</h2> <div> <input type="file" ...

  5. UML2.0

    一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration:缓存的时间,以秒为 ...

  6. jvm比较详尽的内存结构

     JVM内存结构 2012-09-17 15:27:59 分类: Java 本文转自:http://www.blogjava.net/nkjava/archive/2012/03/14/371831. ...

  7. mobile angualar ui的简单使用

    最近做一个微信App形式的业务平台,之前从别人的推荐文中知道了mobile angualar ui这个东西,这次纯做mobile Web就试用了一下,之前PCWeb中用过AngularJS,Hybri ...

  8. Ubuntu16.04下安装Hive

    上一篇博客我们已经说过了要如何安装Hadoop,别忘记了我们的目的是安装Hive.所以这篇博客,我就来介绍一下如何安装Hive. 一.环境准备 (1)Vmware (2)  Ubuntu 16.04 ...

  9. add two nums

    问题描述: 给定两个链表,计算出链表对应位置相加的和,如果和大于10要往后进位.用链表返回结果.其实上是一种大数加法.可以把一个大数倒着写存入链表,然后两个链表相加就是所需要的大数相加的和 输入 2 ...

  10. ML.NET指南

    ML.NET是一个免费的.开源和跨平台的机器学习框架,使您能够构建定制的机器学习解决方案,并将它们集成到您的. net应用程序.本指南提供了许多关于与ML.NET合作资源. 关于ML.NET的更多信息 ...