IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构与算法 -> 正文阅读

[数据结构与算法]数据结构与算法

排序算法C++实现(一)

主要实现冒泡排序、简单选择排序、直接插入排序和希尔排序法。前三者的时间复杂度都为O(n2),希尔排序作为插入排序法的一种,其在内部进行分组,使得时间复杂度为O(nlogn)。

运行结果: 运行结果如上

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void exchange(int &a, int &b);
void test01(int a,int b);
void print(vector<int> input);
vector<int> sort1(vector<int> input);//冒泡排序法 
vector<int> select_sort(vector<int> input);//简单选择排序 
vector<int> InsertSort(vector<int> input);//直接插入排序 
vector<int> Shellsort(vector<int> input);//希尔排序法 
void exchange(int &a, int &b)//采用引用传递,不能使用值传递
{
	int temp = a;
	a = b;
	b = temp;
 } 
 void test01(int a,int b)
 {
 	cout<<a<<" "<<b<<" "<<endl;
 	exchange(a,b);
 	cout<<a<<" "<<b<<" "<<endl;
  } 
  
void print(vector<int> input)
{
	for(int i = 0;i<input.size();++i)
	{
		cout<<input[i]<<' '; 
	}
	cout<<endl;
}
/*****************冒泡排序**************************/

//vector<int> sort1(vector<int> input)
//{
//	int len = input.size();
//	for(int i = 0;i<len;++i)
//	{
//		for(int j = i+1;j<len;++j)
		for(int j = len-1;j>i;--j)//改进,小的值慢慢冒上来 
//		{
			print(input);
//			if(input[i]>input[j])
			if(input[j-1]>input[j])//改进,小的值慢慢冒上来 
//				exchange(input[i],input[j]);
//		}
//	 }
//	 return input; 
//} 
vector<int> sort1(vector<int> input)
{
	int len = input.size();
	for(int i = 0;i<len;++i)
	{
//		for(int j = i+1;j<len;++j)
		for(int j = len-1;j>i;--j)//改进,小的值慢慢冒上来 
		{
//			print(input);
//			if(input[i]>input[j])
			if(input[j-1]>input[j])//改进,小的值慢慢冒上来 
				exchange(input[j-1],input[j]);
		}
	 }
	 return input; 
} 
/*****************简单选择排序**************************/
//选出第i小的,然后与当前i交换,时间复杂度为O(n2) 
vector<int > select_sort(vector<int> input)
{
	int i = 0, j = 0, len = input.size(), min = 0;
	for( i =0; i < len;++i)
	{
		min = i;
		for( j = i + 1; j < len;++j )
		{	
			if(input[j]<input[min])
				min = j;
		}
		if(i!=min)
			exchange(input[i],input[min]); 
	}
	return input;
}
/*****************直接插入法,打牌思想**************************/
//利用一个辅助空间存放当前数值,通过对比当前数与其他数,进行数据的移动 时间复杂度O(n2) 
//如果当前数小于前面的一个数,前面的数后移,下标前移继续比较
//如:9 1 5 3,开始i = 1, j = 0,temp=1,temp<L[0] = 9,,第一轮结果 9 9 5 3; j = -1,不满足j>=0,执行107行,结果为 1 9 5 3
//第二轮:i = 2, j = 1,temp = 5, temp<L[1] = 9, 1 9 9 3; j = 0, temp = 5 > L[0] = 1,break;  执行107行,结果为 1 5 9 3 
//第三轮: i = 3, j = 2, temp = 3, temp<L[2] = 9, 1 5 9 9; j=1,temp<L[1] = 5,1 5 5 9; j = 0, temp = 5 > L[0] = 1,break; 执行107行,结果为 1 3 5 9 
vector<int> InsertSort(vector<int> input) 
{
	int len = input.size(); 
	int temp = 0;//辅助空间
	int i = 0,j = 0;
	for(i = 1;i<len;++i)
	{
		if(input[i]<input[i-1])//无序才进行操作 
		{
			temp = input[i];
			for(j = i-1;j>=0;j--)
			{
				if(temp<input[j])
					input[j+1] = input[j];	
				else 
					break;
			}

			input[j+1] = temp;
			
		}
	 } 
	 return input;
}
/*****************希尔排序法**************************/
//直插法排序的一种,将数据按照间隔进行分组,循环,直到间隔为1
vector<int> Shellsort(vector<int> input)
{
	int len = input.size();
	int gap = len;
	int temp = 0;
	int i = 0,j = 0;
	do{
		gap /=3;
		gap += 1;
		for(i = gap +1;i<len;++i)
		{
			if(input[i]<input[i-gap])
			{
				temp = input[i];
				for(j = i-gap;j>=0;j-=gap)
				{
					if(temp<input[j])
						input[j+gap] = input[j];
					else
						break;
				}
				input[j+gap] = temp;
			}	
		}
	}while(gap>1);
	return input;
} 
/************************测试****************************************/
 int main()
 {
 	int input[] = {90,11,5,8,13,7,4,6,2};
// 	test01(2,5);
//	test01(input[0],input[1]);
// 	for(int i = 0;i<9;++i)
// 		cout<<input[i]<<' ';
// 	cout<<endl;
 	vector<int> Input;
 	for(int i = 0;i<9;++i)
 	{
 		Input.push_back(input[i]);
	}	
 	Input = Heapsort(Input);	
 	print(Input);
 	cout<<"/****************利用自带的数据结构进行堆排序*************************/"<<endl;
	priority_queue<int, vector<int>, less<int> > a;
	priority_queue<int, vector<int>, greater<int> > b;
	for(int i = 0;i<9;++i)
 	{
 		a.push(input[i]);
 		b.push(input[i]);
	}
	while(!a.empty())
	{
		cout<<a.top()<<' ';
		a.pop();
	}
	cout<<endl;
	while(!b.empty())
	{
		cout<<b.top()<<' ';
		b.pop();
	}
 }


  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-09 17:39:16  更:2021-07-09 17:39:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/5 13:56:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码