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. LeetCode之“动态规划”:Unique Binary Search Trees && Unique Binary Search Trees II

    1. Unique Binary Search Trees 题目链接 题目要求: Given n, how many structurally unique BST's (binary search ...

  2. IOS 与ANDROID框架及应用开发模式对比一

    IOS 和ANDROID操作系统都是目前流行的移动操作系统,被移动终端和智能设备大量采用,两者都采用了先进的软件技术进行设计,为了方便应用开发两者都采用了先进的设计模式.两者在框架设计上都采用了什么技 ...

  3. 在Mac OS X下搭建gtk编译环境

    首先安装 XQuartz X11 for Mac ,可以到这里下载: http://xquartz.macosforge.org/landing/ 需要一个包管理器,我用的是brew,其他的操作类似: ...

  4. ASP.NET Core 2.0 使用NLog实现日志记录

    1.安装NuGet包 1.Install-Package NLog.Web.AspNetCore 2.Install-Package NLog 在csproj中编辑: <PackageRefer ...

  5. Nginx实现文件的上传和下载

    文件的上传只要保证特殊的地址先到达Nginx,然后通过Nginx指定至指定的服务器即可,目前配置是本机.文件的下载的做法就是把本机的当前目录下面的文件给返回回去. server { ; server_ ...

  6. ELF 动态链接 - so 的 .dynamic 段

    动态链接文件中最重要的段就是 .dynamic段 这个段里保存了动态链接器需要的最基本的信息 比如:1.  依赖于哪些共享对象, d_tag = DT_NEED,  d_ptr 表示共享对象文件名 2 ...

  7. Angular使用总结 --- 模版驱动表单

    表单的重要性就不多说了,Angular支持表单的双向数据绑定,校验,状态管理等,总结下. 获取用户输入 <div class="container-fluid login-page&q ...

  8. Java 学习资料整理

    Java 学习资料整理 Java 精品学习视频教程下载汇总 Java视频教程 孙鑫Java无难事 (全12CD) Java视频教程 即学即会java 上海交大 Java初级编程基础 共25讲下载 av ...

  9. php能做什么

    PHP(“PHP: Hypertext Preprocessor”,超文本预处理器的字母缩写)是一种被广泛应用的开放源代码的多用途脚本语言,它可嵌入到 HTML中,尤其适合 web 开发. PHP能做 ...

  10. Binary Search 的递归与迭代实现及STL中的搜索相关内容

    与排序算法不同,搜索算法是比较统一的,常用的搜索除hash外仅有两种,包括不需要排序的线性搜索和需要排序的binary search. 首先介绍一下binary search,其原理很直接,不断地选取 ...