本来这是一个很常见的算法,可是接触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;
}
今天还不错,学习了两种排序算法