2021-2-10《冒泡排序》《插入排序》《选择排序》《希尔排序》

冒泡排序(bubblesort)

N个数只要进行N-1次排序

#include<iostream>

using namespace std;
//升序 
int main()
{
	int a[6]={5,6,4,2,1,3};
	for(int i=0;i<5;i++) //i 表示外层循环次数;
	{
		for(int j=0;j<6-1-i;j++) //j 表示内层循环次数;
		{
			if(a[j]<a[j+1])	swap(a[j],a[j+1]);
		}
	}
	
	for(int i=0;i<6;i++)
	{
		cout<<a[i]<<" ";
	}
	cout<<endl;
	
	return 0;
	
}

插入排序(insertionsort)

将要排序的数组数据分成两部分,已排序部分和未排序部分;

思路:

1.将开头第一个元素作为已排序元素
2.
++1.取出未排序部分的开头元素赋给变量V;
++2.在已排序部分,将所有比V大的元素向后移动一个位置。
++3.将取出的元素V插入空位。

#include<iostream>

using namespace std; 

int main()
{
	int a[6]={5,6,4,2,1,3};
	int i,j,v;// i 表示未排序的开头元素;j 已排序部分寻找V的插入位置; V 保持a[i]的变量。
	for(i=1;i<6;i++)
	{
		v=a[i];
		j=i-1;
		while(a[j]>v && j>=0)	//注意理清while条件 
		{
			a[j+1]=a[j];
			j--;
			
		}
		a[j+1]=v;	//也可以放在while内的j--;后面; 
	}
	for(int i=0;i<6;i++)
	{
		if(i>0)	cout<<" ";
		cout<<a[i];
	}
	
	return 0;
}

选择排序(selectionsort)

将要排序的N个数据分成已排序和未排序部分;

思路:

一共要重复 N-1 次如下操作(N表示要排序的数据量)
1.找出未排序部分的最小值的位置;
2.将 minj 位置的元素与未排序部分的起始元素(即,已排序部分的最后一个元素)交换。

#include<iostream>

using namespace std;

int main()
{
	int a[6]={5,6,4,2,1,3};
	
	int minj=0;
	
	for(int i=0;i<6-1;i++) // i 表示未排序部分的开头元素; 
	{
		minj=i;		// minj 各轮循环中第 i 号到第 N-1 号元素中最小值的位置; 
		for(int j=i;j<6;j++)	//每轮循环中,用来寻找最小值的位置; 
		{
			if(a[j]<a[minj])	minj=j;
		}
		swap(a[i],a[minj]);
	}
	
	for(int i=0;i<6;i++)
	{
		if(i>0)	cout<<" ";
		cout<<a[i];	
	}
	

	return 0;
}

希尔排序(shellsort)

算法思想的出发点:
1.插入排序在基本有序时,效率较高;
2.在未排序的数据量越小,效率越高;

基本思想:

先将整个待排序的数组数据分割成若干个子序列(子序列的划分并不是逐段分割,而是将相隔每个增量的数据分成一组),分别对子序列进行插入排序,改变确定子序列的增量,再进行插入排序,最后的增量一定要为 1 以便对整个基本有序的数据数组进行一次全体的插入排序。

一般而言增量先取数据大小的一半;之后再取1/4,1/8,…

#include<iostream>

using namespace std;

int main()
{
	int a[10]={5,9,6,7,3,2,4,1,8,10};
	int i,j,v;
	for(int di=10/2;di>0;di/=2)
	{
		for(int i=di;i<10;i++)		//以下部分是插入排序的核心代码,只是将数组间的间隔变为增量 di,而要实现 di 的变化,需要外加一层循环;  
		{							
			v=a[i];				//注意v=a【i】 
			j=i-di;
			while(j>=0 && a[j]>v)
			{
				a[j+di]=a[j];
				j-=di;
			}
			a[j+di]=v;
		}
	}
	
	
	for(int i=0;i<10;i++)
	{
		if(i>0)	cout<<" ";
		cout<<a[i];
	}
	cout<<endl;
	return 0;
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值