简单排序算法

简单排序算法:插入排序,冒泡排序,选择排序,希尔排序

插入排序

算法思想:外层循环控制变量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

原文地址:https://www.cnblogs.com/zhyryxz/p/2576472.html