排序算法(c++编写)

1 篇文章 0 订阅
#include <iostream>
using namespace std;


//选择排序,计算出每个元素的名次
template<class T>
void rank1(T a[], int n, int r[])
{
    for(int i = 0; i < n; i++)
        r[i] = 0;//初始化


    for(int i = 1;i < n;i++)
        for(int j = 0; j < i; j++)
        {
            if(a[j] <= a[i])
                r[i]++;
            else
                r[j]++;
        }
}






//原地重排
template <class T>
void rearrange(T a[], int n, int r[])
{
    for(int i = 0; i < n; i++)
    {
        if(i == r[i])
          i++;
        else
            swap(a[r[i]], a[i]);
    }
}






//前n个元素中最大值的索引值
template<class T>
int indexOfMax(T a[],int n)
{
    int maxIndx = 0;
    for(int i = 1; i < n; i++)
    {
      if(a[maxIndx] < a[i])
            maxIndx = i;
    }
    return maxIndx;
}






//选择排序
template<class T>
void selectionRank(T a[], int n)
{
    for(int size = n; size > 1; size--)
    {
        int j = indexOfMax(a, size);
        swap(a[j],a[size - 1]);
    }


}






//selectionsort:及时终止的选择排序
template<class T>
void selectionSort(T a[],int n)
{
    bool sorted = false;
    for(int size = n;!sorted && (size > 1); size--)//如果有序则及时终止
    {
        int indxOfMax = 0;
        for(int i = 1;i < size; i++)
            if(a[indxOfMax] <= a[i])
                indxOfMax = i;
            else sorted = false;//无序
        swap(a[indxOfMax], a[size - 1]);
    }
}






//一次冒泡排序,如果一次冒泡排序中,没有发生交换,则序列本身就是有序的,可终止排序
template<class T>
bool bubble(T a[], int n)
{
    bool swapped = false;
    for(int i = 0; i < n - 1; i++)
        if (a[i] > a[i+1])
        {
            swap(a[i], a[i+1]);
            swapped = true;
        }
    return swapped;
}


//冒泡排序
template<class T>
void bubbleSort(T a[], int n)
{
    for(int i = n; bubble(a,i) && (i > 1); i--);
}






/*
//一次冒泡排序,没有及时终止排序
template<class T>
void bubble(T a[], int n)
{
    for(int i = 0; i < n - 1; i++)
        if (a[i] > a[i+1])
            swap(a[i], a[i+1]);
}


//冒泡排序
template<class T>
void bubbleSort(T a[], int n)
{
    for(int i = n; i > 1; i--)
        bubble(a,i);
}
*/




//往有序数列a中插入数x,数组大小为n
template<class T>
void insert1(T a[], int n, const T& x)
{
    int i;
    for (i = n - 1; i >= 0 && x < a[i]; i--)
        a[i+1] =  a[i];
    a[i+1] = x;
}
//插入排序,数组大小依次从1增到n
template<class T>
void insertionSort(T a[], int n)
{
    for (int i = 1; i < n; i++)
    {
        T t = a[i];
        insert1(a, i, t);
    }


}
int main()
{
    int a[] = {8,4,2,9,6,3,5,7,1};


    insertionSort(a,9);


    for(int i = 0; i < 9; i++)
    {
        cout << a[i];
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值