排序算法学习经验(一)

来源:互联网 发布:搞笑淘宝买家秀图聊天 编辑:程序博客网 时间:2024/06/05 17:02

近一周多呢在学习排序算法,
同时,我学习了算法大牛刘宇波的排序算法优化,比如双路快排和三路快排等。优化过程也将在以后的博客中详细写出,如有错误或描述不当之处,望指出,感激不尽。
关键点提要:
冒泡排序、选择排序、插入排序、shell排序
归并排序、归并排序优化、快速排序、双路快排、三路快排
堆排序及其优化等其他排序方法

首先是在平均情况下,时间复杂度为O(n^2)的几种排序。
冒泡排序
冒泡排序的实现包含一个双重for循环,每次循环都把合适的元素向上浮,让合适的元素冒泡到合适的位置。C++实现代码如下:

template<typename T>void BubbleSort(T arr[], int n){    for (int i = 0; i < n - 1; i++)    {        //冒泡的过程        for (int j = n - 1; j > i; j--)        {            if (arr[j] < arr[j - 1])                swap(arr[j], arr[j - 1]);        }    }}

选择排序
选择排序和冒泡排序类似,选择排序是在每次循环中,找到合适的元素,直接放到合适的位置,与冒泡排序相比少了很多次交换次数,略微提高了效率。C++实现代码如下:

template<typename T>void selectionSort(T arr[], int n){    for (int i = 0; i < n; i++)    {        int minIndex = i;//设立当前子串最小下标        for (int j = i + 1; j < n; j++)        {            //若当前元素比最小下标对应的元素还要小,            //则更新当前子串最小下标            if (arr[j] < arr[minIndex])                minIndex = j;        }        swap(arr[i], arr[j]);//将元素调到合适的位置    }}

插入排序
插入排序图例说明:
1.初始情况:
初始情况
2.第一个考虑的元素,直接完成插入
第一个考虑的元素,直接完成插入
3.第二个考虑的元素
第二个考虑的元素
4.与前面的子串相比较插入合适的位置
与前面的子串相比较插入合适的位置
5.第三个要考虑的元素
第三个要考虑的元素
6.第一次与前面的比较,比前一个数小,则交换位置
第一次与前面的比较,比前一个数小,则交换位置
7.第二次与前面的比较,比前一个数小,又交换位置,此时完成了第三个数的插入
第二次与前面的比较,比前一个数小,又交换位置,此时完成了第三个数的插入
8.第四个元素
第四个元素
9.第四个元素第一次比较,比前一个数小,交换位置
第四个元素第一次比较,比前一个数小,交换位置
10.第四个元素第二次比较,比前一个数小,交换位置
第四个元素第二次比较,比前一个数小,交换位置
11.此时比前一个元素大,结束第四个元素的插入
此时比前一个元素大,结束第四个元素的插入
依此类推,完成所有元素的排序。
下面是C++的代码:

template<typename T>void insertionSort(T arr[], int n){    for (int i = 1; i < n; i++)    {        int j;        for (j = i; j > 0 && arr[j - 1] > arr[j]; j--)        {            swap(arr[j], arr[j - 1]);        }    }}

插入排序还有一个小小的优化代码,有兴趣的可以看看:

template<typename T>void insertionSort(T arr[], int n){    for( int i = 1 ; i < n ; i ++ )     {        T e = arr[i];        int j; // j保存元素e应该插入的位置        for (j = i; j > 0 && arr[j-1] > e; j--)            arr[j] = arr[j-1];        arr[j] = e;    }}

shell排序
shell排序和插入排序类似,就是讲原来的依次插入变成将一个数组分组,对子序列进行插入排序,最后把子序列组合起来。

template<typename T>void shellSort(T arr[], int n){    int h = 1;    while( h < n/3)        h = 3 * h + 1;    for(int i = h; i < n; i++)    {        T e = arr[i];        int j;        // 对 arr[i], arr[i-h], arr[i-2*h], arr[i-3*h]...         //使用插入排序        for(j = h; j >=h && e < arr[j - h]; j -= h)            arr[j] = arr[j - h];        arr[j] = e;    }}

下一篇将会在两天后更新,如本篇博客有错误或描述不当之处,望指出,感激不尽。

原创粉丝点击