简单排序算法
简单排序算法:插入排序,冒泡排序,选择排序,希尔排序
插入排序
算法思想:外层循环控制变量i由1至n-1递进,用于选择当前处理哪条记录;里层循环控制变量j由i至1递减,与上一记录比较,决定将该j位置记录插入到哪个位置。每个记录与前面已经排序好的记录序列进行比较,并将其插入到合适的位置。当处理第i条记录时,前面i-1条记录已经是有序的了。
//插入排序
template<class T, class C>
void InsertSort( T a[ ], int length){
for(int i=1; i<=length-1;i++){
int j=i;//处理i这条记录,将其与前面排序好的i-1个记录比较,插入到合适位置
for(int j>=1 && C::Smaller(a[j],a[j-1])){
swap(a[j],a[j-1]);
j--;
}
}
}
冒泡排序
算法思想:外层循环控制比较的趟数,由0到n-2共比较n-1趟;内层循环进行数组记录的交换,从数组的末尾记录开始与相邻的上一个记录相比,如果上一记录比当前记录的关键码大则进行交换,直到当前记录的下标为1为止(此时上一记录的下标为0)。整个过程就像一个气泡从底部向上升,于是这个排序算法也就被命名为了冒泡排序。
//冒泡排序
template<class T, class C>
void BubbleSort(T a[ ], int length){
for(int i=0;i<=length-2;i++){
for(int j=length-1; j>=1; j--){ //这里比较到i即可。
if(C::Smaller(a[j], a[j-1]))
swap(a[j], a[j-1]);
}
}
}
选择排序
算法思想:它是对冒泡排序的一个改进,可以看出冒泡排序为了将第i小的记录冒泡到下标为i-1的位置进行了多次交换。选择排序的思路是搜索整个数组n-i个记录,寻找出第i小的记录(对整个数组来说是第i小,对于n-i+1个记录来说是最小),然后放置到数组的i-1这个下标位置。可见,每一趟只进行一次交换。且比较时只比较到i。
寻找最小记录:设置标志“最小记录下标”为lowestIdx,且假设i这个位置上记录为最小即lowestIdx=i,拿数组中其它记录(从最后一个记录开始)与i位置记录相比,若比i位置记录小,则修改标志“最小记录下标”lowestIdx为当前记录下标。第一趟比较定位整个数组的最小记录的下标,将其与0下标互换;第二趟比较定位了n-1个记录的数组的最小记录的下标,将其位置上记录与1下标互换;
//选择排序
template<class T, class C>
void SelectionSort(T a[ ], int length){
for(int i=0; i<= length-2;i++){
int lowestIdx = i;
for(int j=length-1; j>i; j--){
if(C::Smaller(a[j],a[lowestIdx]))
lowestIdx=j;
}
swap(a[i], a[lowestIdx]);
}
}
希尔排序
算法思想:它利用插入排序的一个特点来优化,插入排序的这个特点是:当数组基本有序的时候,插入排序的效率比较高。因为尽管排序的趟数仍一样但是交换的次数却明显减少。
希尔排序就是先让数组基本有序,最后再应用插入排序。
//希尔排序
template<class T, class C>
void ShellSort(T a[ ], int length){
for(int i=length/2; i>=1; i= i/2){
for(int j=0; j<i; j++){//步长为i(假设为4)则说明把整个数组分为i个小数组,每个数组有length/i个记录;对每个小数组进行插入排序,然后改变步长为i/2,继续对小数组插入排序;可见当步长为1时,就是把整个数组分为1个数组,对它进行插入排序
InsertSort<T,C>(&a[j], length-1, i);
}
}
}
//用于希尔排序的插入排序
template<class T, class C>
void InsertSort(T a[ ], int length, int step){
for(int i=step; i<length;i+=step){
int j=i;
while(j>=step && C::Smaller(a[j], a[j-step])){
swap(a[j],a[j-step]);
j-=step;
}
}
}
// 对int类型进行排序
class IntComparer{
public:
static bool Smaller(int x, int y){
return x<y;
}
static bool Equal(int x, int y){
return x==y;
}
static bool Larger(int x, int y){
return x>y;
}
};
代码:
#include "stdafx.h"
#include<iostream>
using namespace std;
template <class T>
void PrintArray(T& a){
int length = sizeof(a) / sizeof(*a);
cout << " Array: ";
for(int i=0;i<=length-1;i++){
cout << a[i] << " ";
}
cout << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
int a[] = {42, 20, 17, 13, 28, 14, 23, 15};
int length = sizeof(a) / sizeof(*a);
PrintArray(a);
SelectionSort<int, IntComparer>(a, length);
//InsertSort<int,IntComparer>(a,length);
PrintArray(a);
return 0;
}
原文:http://www.tracefact.net/Algorithm/SimpleSort.aspx