快速排序和插入排序的C++实现

   本来这是一个很常见的算法,可是接触IT这么长时间了,竟然还不知道这种算法的核心,是在惭愧,最近一直想补习这方面的内容于是也就,开始了我的算法里程,现在就说说快速排序吧,本来我一直是在用冒泡排序的,可是总是被人耻笑,所以呢,现在想想,开始学习吧

   快速排序吧,总体流程是这样的,首先将获取最后一个元素,然后呢根据这最后一个元素将数组分开两部分,一部分比该元素小,另一部分比该元素大,这样就分开了,然后呢利用递归调用,直到有部分都分开了,这样就实现了快速排序

// 快速排序.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include<iostream>
using namespace std;
template<class Any>
int partion(Any* ptr,int l,int r)
{
	Any temp=ptr[r]	;
	int i=l;
	//首先将这l和r之间的数据进行排序,或者说将数组根据temp分成两部分
	for(int j=l;j<r;j++)
	{
		if(ptr[j]>temp)
		{
			Any midVal=ptr[i];
			ptr[i]=ptr[j];
			ptr[j]=midVal;
			i++;
		}
	}	
	//最后一组进行交换,将temp,或者说ptr[r],放在他应该在的位置上,也就是说ptr[r]的右边的数据都比他大,左边的数据都比他小
	Any midVal=ptr[i];
	ptr[i]=ptr[r];
	ptr[r]=midVal;
	return i;
};
template<class Any>
void QuickSort(Any* ptr,int l,int r)
{
	//使用递归方法调用,一直到最后将l和r中间不再有数据,即完成了排序
	if(l<r)
	{
		int middle=partion(ptr,l,r);
		QuickSort(ptr,l,middle-1);
		QuickSort(ptr,middle+1,r);
	}
}
int _tmain(int argc, _TCHAR* argv[])
{
	double p[7]={10.2,50.3,89,12,65,31,51};
	QuickSort(p,0,6);
	for(int i=0;i<7;i++)
	{
		cout<<p[i]<<"  ";
	}
	return 0;
}

这样就完成了快速排序,也许并不是很标准,但是,也是有收获的啊,快速排序需要注意的有两点因为我们使用递归来完成也就注定了,必须要有递归结束条件这里是if(low>=high);还有就是不断更新first和last的值,进行替换,最后重新定位中枢 a[first]=key;   再次递归的调用需要使用的是low   first-1;以及  first+1到high才行

现在看看插入排序,其含义就是假设前n个元素,是排好序的,现在有一个新的元素,要插入到已排好的序列当中去,要做的操作,就是插入排序。

其C++实现代码是这样的

// 插入排序.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
using namespace std;
template<class Any>
void InsertSort(Any* ptr,int length)
{
	for(int i=1;i<length;i++)
	{
		for(int j=0;j<i;j++)
		{
			//进行排序
		    if(ptr[i]>ptr[j])
			{
				Any temp=ptr[i];
				ptr[i]=ptr[j];
				ptr[j]=temp;
				
			}
		}
	}
}
int _tmain(int argc, _TCHAR* argv[])
{
	int ptr[]={10,21,65,35,12,52};
	InsertSort(ptr,6);
	for(int i=0;i<6;i++)
	{
		cout<<ptr[i]<<"  ";
	}
	return 0;
}
今天还不错,学习了两种排序算法


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

世纪殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值