最近在复习排序算法,发现排序算法真的博大精深!我乐此不疲的在追求算法,发现算法就在我身边!以下是大熊对排序算法的理解,无私的与大家分享了!
先不讲理论,举个非常实际的例子!
不知道看这篇文章的哥子会不会打牌?……不会打的话,那你还是不要学算法了,牌里面那么高深的博弈论就这样被你忽视了!开玩笑。……我们每起一张牌的时候,都会把这张牌插入适合他的位置,比如你手上有3,5,6 三张牌,现在起了一张4,很明显你会把他插到3和5之间。这个动作就是插入排序!恭喜你你已经学会了插入排序!
我们来做个实际的例子,先看一组散乱的数字,就像洗散了的牌:
46 59 22 86 70 48 11 9 12 88
我们假设,这10个数字是你之后将起到的10张牌,现在我们来模拟起牌。
第一次你起到46,不做任何事;手上的牌 46
第二次你起到59,跟46比较,比46大,直接放到46右边; 手上的牌 46 59
第三次你起到22,跟59比较,比59小,继续跟46比较,比46小,放到46左边; 手上的牌 22 46 59
第四次你起到86,跟59比较,比59大,直接放到59右边; 手上的牌 22 46 59 86
……
最后我们能把这10 个数从小到大排好,现在再回头看他的规律!
我们会发现,每次我们手上的牌总是有序的,恭喜你已经知道了插入排序的定义!
掌握方法之后就要用计算机来实现了,这个过程叫做建模,或者抽象。我们先看一组计算机排序结果:
红色数据指交换过位置的数。
待排序的数据: 46 59 22 86 70 48 11 9 12 88
第1趟排序结果:46 59 22 86 70 48 11 9 12 88 //59>46,顺序不变
第2趟排序结果:22 46 59 86 70 48 11 9 12 88 //22<59,两个数交换,22<46,两个数再次交换,记住是每次出现<,都要交换。
第3趟排序结果:22 46 59 86 70 48 11 9 12 88
第4趟排序结果:22 46 59 70 86 48 11 9 12 88
第5趟排序结果:22 46 48 59 70 86 11 9 12 88
第6趟排序结果:11 22 46 48 59 70 86 9 12 88 //11<86,交换……11<22,交换
第7趟排序结果:9 11 22 46 48 59 70 86 12 88
第8趟排序结果:9 11 12 22 46 48 59 70 86 88
第9趟排序结果:9 11 12 22 46 48 59 70 86 88
最终排序结果:9 11 12 22 46 48 59 70 86 88
理解原理后,我们来写算法!用C++实现。
/*****楚河***************************************我是分界线帅哥*********下面文字来自大熊*********************/
#include<iostream>
using namespace std;
//插入排序
void insertSort(int a[999],int n)
{
int j = 1,i = 1;
int key = 0,temp = 0;
for(i = 1;i<n;i++)
{
key = a[i];
for(j = i-1;j>=0;j–)
{
if(key<a[j])
{
temp = a[j+1];
a[j+1] = a[j];
a[j] = temp;
}
else
{
a[j+1] = key;//当起到的牌Key大于他前面的那张牌,说明位置放好了,直接跳出
break;
}
}
}
}
int main()
{
//test data:46 59 22 86 70 48 11 9 12 88
int n = 0,i = 0;
int a[999];
cin>>n;//输入要排序数的长度
for(i = 0;i<n;i++)
{
cin>>a[i];
}
insertSort(a,n);
cout<<"最终排序结果:";
for(i = 0;i<n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}