在学习数据结构时,总感觉讲的排序太多了 ,一直都记不住,现在来总结一下。
下面都假设是从小到大排序:
1、插入排序
这算是比较简单的排序,类似于我们打牌时插牌的方法。
从第二个元素开始,拿他跟他前面的元素比较,如果遇到比他大的 , 就互相交换,遇到比他小的就推出。
这个算法比较简单,就不过多的说了。
代码:
#include <iostream>
using namespace std;
template<typename T>//这里运用了模版
void stright_insert_sort(T a[100] , int n)
{
int i , j;
for(i = 2; i <= n; i++)
{
a[0] = a[i];//把比较那个元素先存储在a[0] , 中
for(j = i-1; a[0]<a[j]; j--)
a[j+1] = a[j];
a[j+1] = a[0];
}
}
int main()
{
int a[100];
int n;
cin>>n;
int i;
for(i = 1; i <= n; i++)
cin>>a[i];
return 0;
}
时间复杂度:最好是O(n) , 最坏是O(n^2)
这个算法还有一种优化的方法:在进行比较时,我们可以用二分查找的方法,来进行查找,这样就省掉了比较的操作,可以直接进行移动。
2、希尔排序
希尔排序又叫缩小增量排序。
算法思想:先取一个小于n的整数d1作为第一个增量,把数组中的记录分成d1个组,所有距离(在数组中的位置)对d1余数相同的放在同一个小组,然后再对这些小组分别进行插入排序。然后再去第二个增量d2,d2<d1 , 重复上面的操作。直到所取的增量为1,注意最后一个增量必须为1。
代码:
//希尔排序
#include <iostream>
#include <stdio.h>
using namespace std;
int a[100];
void stright_insert_sort(int n , int f , int delta)
{
int i , j;
for(i = f; i <= n; i += delta)
{
a[0] = a[i];
for(j = i-delta; j >= 1 && a[0]<a[j]; j -= delta)
a[j+delta] = a[j];
a[j+delta] = a[0];
}
}
int main()
{
int n , i , delta;
cin>>n;
for(i = 1; i <= n; i++)
cin>>a[i];
for(delta = n/3; delta > 3; delta /= 3)
{
for(i = 1; i <= delta; i++)
stright_insert_sort(n , i , delta);
}
stright_insert_sort(n , 1 , 1);
for(i = 1; i <= n; i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
3、归并排序
归并排序类似于分治法,归并排序分2路归并和多路归并,我们只分析2路归并。
对于一个序列,我们从中间把它分开,得到两个序列,重复这样的操作,直到某段序列只剩下一个元素时。每段序列排好序之后,我们再把这两端序列合并成一段序列,这就是归并。
因此归并排序分两种实现:1、递归归并 2、非递归归并。 我们只介绍递归归并
代码:
//2路归并排序
//用递归实现的归并排序
#include <iostream>
#include <stdio.h>
using namespace std;
int a[100];
int n;
void merge_sort_merge(int front , int rear , int mid);
void merge_sort(int front , int rear )
{
if(front >= rear) return ;
int mid = (front+rear)/2;
merge_sort(front , mid);
merge_sort(mid+1 , rear);
merge_sort_merge(front , rear , mid);
}
void merge_sort_merge(int front , int rear , int mid)
{
int i , j , k = front;
int temparray[100];
for(i = front; i <= rear; i++)
temparray[i] = a[i];
for(i = front , j = mid+1; i<=mid && j <= rear; )
{
if(temparray[i] < temparray[j])
{
a[k++] = temparray[i++];
}
else
{
a[k++] = temparray[j++];
}
}
if(i <= mid)
{
for( ; i <= mid; i++)
a[k++] = temparray[i];
}
else
{
for( ; j <= rear; j++)
a[k++] = temparray[j];
}
}
int main()
{
cin>>n;
int i;
for(i = 0; i < n; i++)
cin>>a[i];
merge_sort(0 , n-1);
for(i = 0; i < n; i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
还有效率比较很的快排和堆排 , 下次再介绍。
原文:http://blog.csdn.net/zengchen__acmer/article/details/23946205