C++排序算法

C++排序

排序算法是编程中常用的算法之一,实际上,排序大概是最最常用的了,下面,我们来介绍一下c++的排序算法,不过介绍之前,我们可以先看一个非常容易理解的函数:

template<class t>
inline size_t size(t ax[])
{
    return sizeof(ax)/sizeof(t);
}//简单的数组大小内联函数

该函数大部分时候可以帮我们干许多事,尽管并不要求一定需要,我们用这个函数还是挺方便的

冒泡排序(Bubble Sort)

好吧,这是一种所蕴含的思想极其朴素的一种算法,其主要思想是:给定一个数集(在c++里可以理解成数组之类的)并将第二个数与第一个数比较,找出小的,然后把比较的小的换到前边,之后把现在的第二个数与第三个数再一次比较,并找到小的,再换,以此类推,在比较完最后一个数后,我们就找到了最小的,把最小的放在第一个,然后,我们便可以在剩下的数中再一次进行一轮比较,又一次,又一次,最终,我们就按照升序排序好了一个数集。
不过在看代码前,您可能想知道冒泡排序为什么叫做冒泡排序:

这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。(来源自维基)

以下是代码:

#include<stdio.h>

using namespace std;

template<class t>
t[] BubbleSort(t[])
int main()
{

}
template<class t>
void BubbleSort(t ax[],size_t len)//升序的冒泡排序,直接改变数组内的值,其中len是排序数量
{

    size_t i, j;
    t temp;
    for (i = 0; i < len - 1; i++)
    {
        for (j = 0; j < len - 1 - i; j++)
        {
            if (ax[j] > ax[j + 1])
            {
                temp=ax[j];
                ax[j]=ax[j+1];
                ax[j+1]=temp;//交换位置
            }
        }
    }
}

以上就是冒泡排序的代码,当然,main函数啥也没干,我加上main函数只是为了您以后的测试。
下边介绍下冒泡函数的性质,引自维基百科

在最坏的情况,冒泡排序需要 O(n^2)次交换

在最好情况下,冒泡需要O(n)次比较。
当然,冒泡排序可以被改进改进,这会在下边讲,而现在,我们先来看一看下一个算法:

插入排序(Insertion Sort)

又一种简单的算法,不过,该算法需要一点额外的空间,但是,如果你家电脑不是dos机的话,这些额外的内存非常划算。
首先,我们先看一个例子:
{2,8,1,35,6}
我们用插入排序的思想来排序:
首先,我们从头开始,先认为2,也就是开头的数字是已经被排序好的。
然后,我们看下一个数,8,从该数往前依次比较,直到找到一个小于或等于8的数,然后,把这个数与8交换,然而找了一圈,并没有。
然后,我们可以继续按照上边的方法排序,直到找到一个数比前边排序好的数列小的,然后,将该数插入进小于等于其的数的后边,并把后边的排序好的数列往后移动一次。
之后,我们就可以不断这样,便可以排序好了。
以下的代码引自维基百科:

#include<stdio.h>
template<typename T> //整数或浮点数皆可使用,若要使用class,需有定义>运算符
  void insertion_sort(T* arr, int len) {
    size_t i, j;
    T temp;
    for (i = 1; i < len; i++) {
        temp = arr[i];
        j = i - 1; // 如果将赋值放到下一行的for循环内, 会导致在第10行出现j未声明的错误
        for (; j >= 0 && arr[j] > temp; j--)
            arr[j + 1] = arr[j];//最后一次执行该语句后,跳出当前for循环前,会再一次执行j--
        arr[j + 1] = temp;//执行完上一个语句(即for语句)后,跳出的位置保存在j中,此时arr[j]的值是没有经过移动的,不能替换,应该替换的是arr[j+1]
    }
 }
 //以下是添加进来的啥也不干的main函数
 void main()
 {

 }
 ```

 值得说明的一点是插入排序的复杂度与冒泡排序一样,时间复杂度最坏情况下为O(N^2)最好情况下为O(n)但是,俩算法的交换次数不同,最坏时,冒泡排序需要O(n^2)次交换,而插入排序则只有O(n)次,也就是说,插入排序的最坏情况所需时间应该会比冒泡排序好的多。
 当然,此排序算法也可以改进,以后再说。
## 选择排序(Selection sort)
选择排序,其道理简单易懂,先找数组中最小的,找到后便会把这个数与第1个数交换,之后,在剩下的数中再一次找到最小的,并且与第2个数交换,然后是第3个,第4个,就这样,不停的交换之后,就排序成功了。
以下代码依然引自维基百科:

``
include<stdio.h>
template<typename T> //整数或浮点数皆可使用,若要使用class,需有定义>运算符
void selection_sort(T arr[])
{
    size_t size=sizeof(arr)/sizeof(T)-1;
    T temp;
    for (size_t i = 0; i < size; i++)
    {
        int min = i;
        for (int j = i + 1; j < arr.size(); j++)
        {
            if (arr[j] < arr[min])
            {
                min = j;
            }
        }
        temp=ax[j];
        ax[j]=ax[j+1];
        ax[j+1]=temp;//交换位置
    }
}
void main()
{

}

选择排序的比较次数为O(n^2)而交换次数为O(n),由于交换需要的时间较多,因此,当n较小时,选择排序比冒泡排序好那么一丁点,而且,选择排序能够原地

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值