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. shell-like program(shell程序的基本实施部分)

    直接上代码: #include "apue.h" #include <sys/wait.h> int main(void) { char buf[MAXLINE]; / ...

  2. Linux的常用命令(2) - 关机

    关机命令 shutdown‑h now 立即进行关机 shutdown‑r now 现在重新启动计算机 -t sec : -t后面加秒数,即"过几秒后关机" -k      : 不 ...

  3. SpriteBuilder中的CCB Node尺寸

    当你创建一个类型为Layer的CCB文件时,你将注意到它的默认尺寸大小为568x384. 568个点是4英寸iphone的宽度,同时iPad屏幕只有512个点宽,更准确的说--SpriteBuilde ...

  4. NOSQL schema创建原则

    (1)数据规模 Bigtable类数据库系统(HBase,Cassandra等)是为了解决海量数据规模的存储需要设计的.这里说的海量数据规模指的是单个表存储的数据量是在TB或者PB规模,单个表是由千亿 ...

  5. LeetCode(67)-Rotate Array

    题目: Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the ar ...

  6. 初识MySQL数据库的各种CMD命令窗口下的指令

    今天我们就来看一下数据库的各种命令,以下命令全部是从CMD命令窗口下的命令行输入指令,首先如果如果输入mysql,系统提示"mysql不是内部命令或外部命令.那么这其实是环境变量没有设置好的 ...

  7. centos下 redmind2.6安装

    1.下载安装redmind有关软件 cd /tmp wget http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.5.tar.gz wget http:/ ...

  8. Java Web开发中路径问题小结

     Java Web开发中,路径问题是个挺麻烦的问题,本文小结了几个常见的路径问题,希望能对各位读者有所帮助. (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 图1 ...

  9. 第15章-输入/输出 --- File类

    (一) Java的IO通过java.io包下的类和接口来支持,在java.io包下主要包括输入.输出两种IO流. 每种输入.输出流又分为字节流和字符流两大类: (1)字节流以字节为单位来处理输入.输出 ...

  10. imgAreaSelect 中文文档

    http://www.cnblogs.com/boychenney/archive/2011/10/08/2201996.html 一.技术文档 1.介绍 ImgAreaSelect是一jQuery插 ...