关闭

排序算法之一: 基本的选择,插入,冒泡排序

1060人阅读 评论(1) 收藏 举报

三种排序入门级别算法。








#include "stdafx.h"
 #include <Windows.h>
 #include <iostream>
 
 // 打印数据
 void ShowNums(int colNum, int totalNum, int *pData);
 
 // 创建随机数据
 void ProduceRandomNum(int num, int range_min, int range_max, int* &pData);
 
 // 插入排序
 void InsertionSort(int* &pData, int num);
 
 // 选择排序
 void SelectionSort(int* &pData, int num);
 
 // 冒泡排序
 void BubbleSort(int* &pData, int num);
 
 // 打乱排序
 void Shuffle(int* &pData, int num, int seed);
 
 
 
 
 void SelectionSort(int* &pData, int num)
 {
 	int minNum;
 	int minNumNO;
 	int temp;
 
 	for (int i = 0; i < num - 1; i ++)
 	{
 		minNum = pData[i];
 		minNumNO = i;
 		for (int j = i; j < num; j ++)
 		{
 			minNum = minNum <= pData[j] ? minNum : pData[j];
 			if (minNum == pData[j])
 			{
 				minNumNO = j;
 			}
 		}
 		temp = pData[i];
 		pData[i] = minNum;
 		pData[minNumNO] = temp;
 	}
 }
 
 void InsertionSort(int* &pData, int num)
 {
 	int nCur;
 	int nTmp;
 	int nTmp2;
 	bool bGet = false;
 	for ( int  i = 1; i < num; i ++)
 	{	
 		nCur  = pData[i];
 		bGet = false;
 		for (int j = 0; j < i; j ++)
 		{
 			if (!bGet && nCur < pData[j])
 			{
 				nTmp = pData[j];
 				pData[j] = nCur;
 				bGet = true;
 			}
 			if (bGet == true)
 			{
 				nTmp2 = pData[j + 1];
 				pData[j + 1] = nTmp;
 				nTmp = nTmp2;
 			}
 		}
 	}
 }
 
 void BubbleSort(int* &pData, int num)
 {
 	int nCur;
 	int nNex;
 	bool bNotChange = true;
 	for (int i = 0; i < num; i ++)
 	{
 		bNotChange = true;
 		for (int j = 1; j < num - i; j ++)
 		{
 			if (pData[j - 1] > pData[j])
 			{
 				nNex = pData[j];
 				pData[j] = pData[j - 1];
 				pData[j - 1] = nNex;
 				bNotChange = false;
 			}
 		}
 		if (bNotChange)
 		{
 			break;
 		}
 	}
 }
 
 void Shuffle(int* &pData, int num, int seed)
 {
 	srand(seed);
 	int nTemp;
 	for (int i = 0; i < num; i ++)
 	{
 		int j = (double) rand() / (RAND_MAX + 1) * num;
 		nTemp = pData[j];
 		pData[j] = pData[i];
 		pData[i] = nTemp;
 	}
 }
 
 
 void ShowNums(int colNum, int totalNum, int *pData)
 {
 	std::string str;
 	std::string strTmp;
 	char cTmp[256];
 	for (int i = 0; i < totalNum; i ++)
 	{
 		sprintf(cTmp, "%d\t", pData[i]);
 		strTmp = cTmp;
 		str += strTmp;
 		if ((i + 1) % colNum == 0)
 		{
 			str += "\n";
 		}
 	}
 	str += "\n";
 	std::cout<<str.c_str()<<std::endl;
 }
 
 void ProduceRandomNum(int num, int range_min, int range_max, int* &pData)
 {
 	int n = GetTickCount();
 	srand(n);
 	for (int i = 0; i < num; i ++)
 	{
 		pData[i] = (double)rand() / (RAND_MAX + 1) * (range_max - range_min) + range_min;
 	}
 }
 
 
 int _tmain(int argc, _TCHAR* argv[])
 {
 	int nTotalNum = 5;
 	int *pData = new int[nTotalNum];
 
 	ProduceRandomNum(nTotalNum, 0, 1000, pData);
 	std::cout<<"原始数据:"<<std::endl;
 	ShowNums(10, nTotalNum, pData);
 
 	SelectionSort(pData, nTotalNum);
 	std::cout<<"选择排序"<<std::endl;
 	ShowNums(10, nTotalNum, pData);
 
 	Shuffle(pData, nTotalNum, GetTickCount() + 1);
 	std::cout<<"随机排序"<<std::endl;
 	ShowNums(10, nTotalNum, pData);
 
 	InsertionSort(pData, nTotalNum);
 	std::cout<<"插入排序"<<std::endl;
 	ShowNums(10, nTotalNum, pData);
 
 	Shuffle(pData, nTotalNum, GetTickCount() + 2);
 	std::cout<<"随机排序"<<std::endl;
 	ShowNums(10, nTotalNum, pData);
 
 	BubbleSort(pData, nTotalNum);
 	std::cout<<"冒泡排序"<<std::endl;
 	ShowNums(10, nTotalNum, pData);
 
 
 	if (pData)
 	{
 		delete []pData;
 		pData = NULL;
 	}
 	return 0;
 }
 
 //原始数据:
 //587     269     210     260     508
 //
 //选择排序
 //210     260     269     508     587
 //
 //随机排序
 //269     210     508     587     260
 //
 //插入排序
 //210     260     269     508     587
 //
 //随机排序
 //587     269     508     260     210
 //
 //冒泡排序
 //210     260     269     508     587
 //
 //请按任意键继续. . .
 




1
0
查看评论

白话经典算法系列之一 冒泡排序的三种实现

冒泡排序是非常容易理解和实现,,以从小到大排序举例: 设数组长度为N。 1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。 2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。 3.N=N-1,如果N
  • MoreWindows
  • MoreWindows
  • 2011-08-06 19:20
  • 178364

排序算法整理(C++):插入排序、交换排序、选择排序、归并排序

结合《王道》,整理了常用的排序算法,包括直接插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、二路归并排序。   各排序算法的性能平均表: 代码如下: #include #define N 10 using namespace std; void InsertSor...
  • sinat_31135199
  • sinat_31135199
  • 2017-05-08 15:43
  • 264

数据结构之排序算法(二)-冒泡排序及改进

冒泡排序算法需要遍历几次数组。每次遍历都要比较连续相邻的元素,如果某一对相邻元素是降序,则互换它们的值,否则,保持不变。由于较小的值像“气泡”一样逐渐浮想顶部,而较大的值沉向底部,所以叫冒泡排序。 冒泡排序的图解是: 总结一句话就是:连续比较相邻的元素,降序则呼唤。有n个数,共需要比较n...
  • tuke_tuke
  • tuke_tuke
  • 2015-12-21 15:10
  • 2141

Java排序算法之冒泡排序和选择排序

前言:纵然伤心,也不要愁眉不展,因为你不知是谁会爱上你的笑容。——泰戈尔 《飞鸟集》 原文出处: import java.util.Arrays; class Demo { public static void main(String[] args) { in...
  • u014158743
  • u014158743
  • 2016-09-19 23:14
  • 691

算法效率的分析--【以选择排序与冒泡排序为基础】

在前面我们实现了选择排序与冒泡排序的具体实现,现在我们从数学的角度分析下算法的效率问题:               首先我们把两种排序算法的概念重温一遍: 选择排序:在...
  • Toplifeww
  • Toplifeww
  • 2015-02-02 19:44
  • 1629

选择、冒泡、快速、归并、插入排序算法的运行时间比较

包括选择排序,冒泡排序,归并排序,快速排序,插入排序 代码如下: #include #include #include using namespace std; void selection (int a[],int n);//选择排序 void bubble(int a[],int n);...
  • iamubbTing
  • iamubbTing
  • 2016-09-29 20:19
  • 889

九种经典排序算法详解(冒泡排序,插入排序,选择排序,快速排序,归并排序,堆排序,计数排序,桶排序,基数排序)

综述 最近复习了各种排序算法,记录了一下学习总结和心得,希望对大家能有所帮助。本文介绍了冒泡排序、插入排序、选择排序、快速排序、归并排序、堆排序、计数排序、桶排序、基数排序9种经典的排序算法。针对每种排序算法分析了算法的主要思路,每个算法都附上了伪代码和C++实现。 电梯直达 1. 冒泡排...
  • damontive
  • damontive
  • 2018-01-26 01:08
  • 70

两种简单的数组排序算法:冒泡排序和直接选择排序(升序)

冒泡排序的基本思想是:面对一排数据,先从前往后两两比较,如果前一个数比后一个数大就交换两者的顺序,即第一个数和第二个数比,第二个数和第三个数比,……,倒数第二个数和最后一个数比,这样一轮下来以后最大的数就排到最后;接着把除去最大的数的该组数据进行同样的操作,直至这组数只剩下一个,排序结束。 以下为...
  • TroyFish
  • TroyFish
  • 2016-08-28 09:29
  • 1857

排序算法之(1)——冒泡排序

**【冒泡排序的思想】** 冒泡排序总共进行n-1趟,每一趟扫描总是通过两两比较把大的往后放,所以第一趟即把最大数放在最后面,接着第二趟把第二大数放在倒数第二的位置………….到n-1完成,此时只有一个数未排序,这个数就是最小元素,不再需要扫描,此时完成对所有元素的排序。
  • adminabcd
  • adminabcd
  • 2015-06-06 10:11
  • 874

初级排序算法(选择、插入、冒泡排序)

初级排序算法初级排序算法 选择排序 插入排序 冒泡排序选择排序1、算法思想: 将待排序序列分为两部分,一部分为有序序列,另一部分为无序序列。第一趟:从a[0]到a[n-1]中找到最小的数a[i],然后将a[i]与a[0]交换,第二趟:从a[1]到a[n-1]中找到最小的数a[j],然后将a[j...
  • liu_wenbin
  • liu_wenbin
  • 2017-01-09 14:36
  • 244
    个人资料
    • 访问:193714次
    • 积分:3575
    • 等级:
    • 排名:第10996名
    • 原创:106篇
    • 转载:51篇
    • 译文:15篇
    • 评论:37条
    博客专栏
    文章分类
    站长统计