归并排序,选择排序,插入排序,高效插入排序,快速排序

原创 2016年08月30日 20:12:07

本文总结了插入排序,归并排序,快速排序,选择排序4种方法,思路清晰,简单明了。


插入排序

特点:稳定,时间复杂度 O(n^2)

原理:以数组首端为已排序好的数列(虽然只有一个),从数组首端地址之后的待排序数组成员找到已经排序好的数列的插入位置,将待排序成员插入该位置,位置之后的成员依次往后移一位。

归并排序

特点:稳定,时间复杂度 O(nlog n)

原理:归,递归之意,并,合并之意,归:利用递归思路,分隔数组为2部分数组,不断递归,最终实际上得到只含有1个成员的数组,完成排序;归:假如两个数组均排好序,采用两指针对比大小,将两数组合并。

快速排序

特点:不稳定,时间复杂度 最理想 O(nlogn) 最差时间O(n^2)

原理:确定基准变量,从待排序数组选择大于和小于基准变量的成员,交换两成员位置,同时把基准变量放置于两成员之间,这样既可保证得到一个:小于基准变量,基准变量,大于基准变量的序列;利用递归进行循环,既可快速排序。

选择排序

特点:不稳定,时间复杂度 O(n^2)

原理:先选择整个数列的最大或最小值,放置于数组首端,去除该数字,再选择最大或最小值,放置于数组首端之后,依次循环。


程序输入:一组数值,数值之间空格,回车结束输入

程序输出:各类排序结果由小到大输出

sample input: 56 23 1 4 6

sample output: 1 4 6 23 56



#include <iostream>
using namespace std;
int result[1000];
		
void mergearray(int a[],int first,int mid ,int last)
{	
	int i,j,k,n,m;
	i=first;
	n=mid;
	j=mid+1;
	m=last;
	k=0;
	while(i<=n && j<=m)
	{
		if(a[i]<a[j])
		{
		result[k++]=a[i++];
		}
		else
		{
		result[k++]=a[j++];
		}
	}

	while(i<=n)
	{	
		result[k++]=a[i++];
	}
	while(j<=m)
	{	
		result[k++]=a[j++];
	}

	k=0;
	i=0;
	while(first+i<=last)
	{
		a[first+i]=result[k++];
		i++;
	}
}


void merge(int arr[],int first,int last)
{
	int mid=(first+last)/2;
	if(first<last)
	{
		merge(arr,first,mid);
		merge(arr,mid+1,last);
		mergearray(arr,first,mid,last);
	}

}

void choose(int arr[],int first,int last)
{
	for(int i=first;i<last;i++)
		for(int j=i+1;j<=last;j++)
			if(arr[j]<arr[i])
			{
				int temp=arr[i];
				arr[i]=arr[j];
				arr[j]=temp;
			}
}

void insert(int arr[],int first,int last)
{
	for(int i=first+1;i<=last;i++)
	{
		int tag=i;
		for(int j=i-1;j>=first;j--)
			if(arr[j]>arr[i])
			{
				tag=j;
			}

		if(tag!=i)
		{
			int temp=arr[i];
			for(int w=i-1;w>=tag;w--)
			arr[w+1]=arr[w];
		arr[tag]=temp;
		}
	}
}

void inserthigh(int arr[],int first,int last)
{
	for(int i=first+1;i<=last;i++)
	{
		int tempnum=i;
		for(int j=i-1;j>=first;j--)
			if(arr[j]>arr[tempnum])
			{
				int temp=arr[tempnum];
				arr[tempnum]=arr[j];
				arr[j]=temp;
				tempnum=j;
			}	
	}
}

void quicksort(int arr[],int first,int last)
{		
	int leftpoint=first;
	int rightpoint=last;
	int base=arr[first];
	int temp=0;
	if(leftpoint>=rightpoint)
		return;
			
	while(leftpoint!=rightpoint)
	{
		while(arr[rightpoint]>=base && leftpoint<rightpoint )
		rightpoint--;
		while(arr[leftpoint]<=base && leftpoint<rightpoint)
		leftpoint++;

		if(leftpoint<rightpoint)
		{			
		temp=arr[rightpoint+1];
		arr[leftpoint+1]=arr[rightpoint+1];
		arr[rightpoint+1]=temp;
		}
	}

	int middle=(leftpoint+leftpoint)/2;
	arr[first]=arr[middle];
	arr[middle]=base;

	quicksort(arr,first,middle);
	quicksort(arr,middle+1,last);

}

int main()
{
	int array[1000];
	int casenum=0;
	int arraynum=0;

	while(cin>>array[arraynum] )
	{
	arraynum++;
	if(getchar() == '\n') break;
	}

	cout<<"排序前数组为:   "<<endl;
	for(int i=0;i<arraynum;i++)
		cout<<array[i]<<" ";
	
	cout<<endl<<"请选择排序方法(0-归并排序,1-选择排序,2-插入排序,3-高效插入排序,4-快速排序):"<<endl;
	cin>>casenum;
	switch(casenum)
	{
	case 0: merge(array,0,arraynum-1);
			cout<<endl<<"归并排序结果:"<<endl;
			break;
	case 1: choose(array,0,arraynum-1);
			cout<<endl<<"归并排序结果:"<<endl;
			break;
	case 2:	insert(array,0,arraynum-1);
			cout<<endl<<"插入排序结果:"<<endl;
			break;
	case 3:	inserthigh(array,0,arraynum-1);
			cout<<endl<<"高效插入排序结果:"<<endl;
			break;
	case 4:	quicksort(array,0,arraynum-1);
			cout<<endl<<"快速排序结果:"<<endl;
			break;
	default:	cout<<endl<<"您的输入有误,排序失败,原结果为:"<<endl;	
	}
	
	for(int i=0;i<arraynum;i++)
		cout<<array[i]<<" ";

	int pause;
	cin>>pause;
	return 1;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

各种排序总结(一)之--—冒泡排序、选择排序、快速排序

各种排序总结——冒泡排序、选择排序、快速排序        1、冒泡排序是比较经典的排序方法,是一种用时间换空间的排序方法。我总结了一下它的特点:(1)它的时间复杂度是;(2)每一趟相邻元素两两比较完...
  • xinyu2015
  • xinyu2015
  • 2015年11月04日 16:36
  • 4124

选择排序与快速排序

垃圾的资源分享
  • leizhehan
  • leizhehan
  • 2017年04月27日 17:43
  • 245

使用插入排序优化快速排序的算法实现

实验目的:       快速排序可以按照以下的算法思想优化,并加快快速排序的速度:即当快速排序所划分的子序列的长度小于某个定值k时,该子序列基本有序,可以采用插入排序的办法对子序列进行排序,从而使整体...
  • icyfire0105
  • icyfire0105
  • 2008年01月26日 10:46
  • 3473

数组的插入排序和快速排序

前言 关于对数组的排序,在算法中有很多方法,较为简单的有冒泡,选择,插入等一些使人熟知的算术方法,在当今这个追求效率的社会,算法的好坏对程序本身有着重要的影响。而我们在判定算法好坏的时候,时间复杂度是...
  • li741350149
  • li741350149
  • 2016年09月17日 15:27
  • 1152

常用排序算法--合并排序和快速排序

常用排序算法——合并排序 常用排序算法合并排序 分治 合并排序和快速排序 快速排序的递归实现 合并排序的递归实现 合并排序的非递归实现分治分治(Divide and Conquer)是一场常见的算法策...
  • u014532901
  • u014532901
  • 2016年09月30日 16:42
  • 1164

归并排序和快速排序的比较

写在前面1.          本文内容对应《算法导论》(第2版)》第2章和第7章。2.          比较了归并排序与快速排序之间的不同策略,启发对分治算法的深入思考。3.          希...
  • louiswang2009
  • louiswang2009
  • 2010年05月22日 11:51
  • 14418

分治法在归并排序和快速排序中的应用

归并排序 归并排序和快速排序都使用了“分治”策略(divide-and-conquer)。对于数组A[p..r],归并排序先把数组从中间分开,形成两个具有(p+r)/2个元素的子数组(divide)...
  • qtyl1988
  • qtyl1988
  • 2016年05月22日 23:15
  • 452

归并排序和快速排序比较

最近在做一个算法实验:归并排序和快速排序的比较。 这两种算法在排序方面是非常非常的通俗的了,权威的文献和网上的相关文章也是一大堆,在这里就简单贴下代码,写下个人从这个实验中学到的东西。 先说说个人对这...
  • u010962810
  • u010962810
  • 2013年12月30日 23:13
  • 9467

插入排序 快速排序 分析整理

1、插入排序 插入排序是将一个元素插入到已经排好序的子序列中,实现下,n表示数组的长度。在排第i元素时,先将第i个元素暂存(temp=a[i]),然后i-1个位置开始依次将比a[i]大的元素后移。最终...
  • x_i_y_u_e
  • x_i_y_u_e
  • 2015年03月22日 10:54
  • 1618

五类排序算法(插入,交换,选择,归并)

五种排序方法 插入排序 直接插入排序 希尔排序 交换排序 冒泡排序 快速排序 选择排序 简单选择排序 堆排序 归并排序 分类排序 排序方法基本思想和算法描述 直接插入排序/冒泡排序...
  • biezhihua
  • biezhihua
  • 2016年08月17日 00:05
  • 3629
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:归并排序,选择排序,插入排序,高效插入排序,快速排序
举报原因:
原因补充:

(最多只允许输入30个字)