数据结构开发(17):冒泡排序和希尔排序

0.目录

1.冒泡排序

2.希尔排序

3.小结

1.冒泡排序

冒泡排序的基本思想:

第 i 次冒泡排序示例:

实现冒泡排序(在Sort.h中):

public:
    template <typename T>
    static void Bubble(T array[], int len, bool min2max = true)
    {
        bool exchange = true;

        for(int i=0; (i<len) && exchange; i++)
        {
            exchange = false;

            for(int j=len-1; j>i; j--)
            {
                if( min2max ? (array[j] < array[j-1]) : (array[j] > array[j-1]) )
                {
                    Swap(array[j], array[j-1]);
                    exchange = true;
                }
            }
        }
    }

mian.cpp测试

#include <iostream>
#include "Sort.h"

using namespace std;
using namespace StLib;

int main()
{
    int array[] = {3, 1, 2, 5, 4};

    Sort::Bubble(array, 5);

    for(int i=0; i<5; i++)
    {
        cout << array[i] << endl;
    }

    cout << "~~~" << endl;

    Sort::Bubble(array, 5, false);

    for(int i=0; i<5; i++)
    {
        cout << array[i] << endl;
    }

    return 0;
}

运行结果为:

1
2
3
4
5
~~~
5
4
3
2
1

2.希尔排序

希尔排序的基本思想:

  • 将待排序列划分为若干组,在每一组内进行插入排序,以使整个序列基本有序,然后再对整个序列进行插入排序。

希尔排序示例:

实现希尔排序(在Sort.h中):

public:
    template <typename T>
    static void Shell(T array[], int len, bool min2max = true)
    {
        int d = len;

        do
        {
            d = d / 3 + 1; // d--

            // 采用插入排序
            for(int i=d; i<len; i+=d)
            {
                int k = i;
                T e = array[i];

                for(int j=i-d; (j>=0) && (min2max ? (array[j]>e) : (array[j]<e)); j-=d)
                {
                    array[j+d] = array[j];
                    k = j;
                }

                if( k != i )
                {
                    array[k] = e;
                }
            }

        } while( d > 1 );
    }

mian.cpp测试

#include <iostream>
#include "Sort.h"

using namespace std;
using namespace StLib;

int main()
{
    int array[] = {3, 1, 2, 5, 4};

    Sort::Shell(array, 5);

    for(int i=0; i<5; i++)
    {
        cout << array[i] << endl;
    }

    cout << "~~~" << endl;

    Sort::Shell(array, 5, false);

    for(int i=0; i<5; i++)
    {
        cout << array[i] << endl;
    }

    return 0;
}

运行结果为:

1
2
3
4
5
~~~
5
4
3
2
1

3.小结

  • 冒泡排序每次从后向前将较小的元素交互到位
  • 冒泡排序是一种稳定的排序法,其复杂度为 O(n2)
  • 希尔排序通过分组的方式进行多次插入排序
  • 希尔排序是一种不稳定的排序法,其复杂度为 O(n3/2)

原文地址:https://www.cnblogs.com/PyLearn/p/10150618.html

时间: 2024-08-14 20:40:17

数据结构开发(17):冒泡排序和希尔排序的相关文章

小朋友学数据结构(9):希尔排序

小朋友学数据结构(9):希尔排序 (一)基本思想 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止. (二)例子 有一个数组,其原始数组为: 2-1.png 取初始增量gap = length / 2 = 5,这样就将整个数组分为5组(每组用相同的颜色表示) 2-2.png 将这5组的数据分别按由小到大的顺序排列,结果为 2-3.png 缩小增量gap = gap / 2 = 2,整

冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析

冒泡排序 1 //冒泡排序 2 ////////////////////////////////////////////////////////////////////////// 3 void BubleSort(int a[],int n) 4 { 5 int temp; 6 bool flag=false; 7 for (int i=0;i<n;i++) 8 { 9 flag=true; 10 for (int j=0;j<n-i-1;j++) 11 { 12 if(a[j]>a[

浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析(好戏在后面,有图有真相)

由于没考虑到一些情况,对以上一些算法做了改进和对比!以及昨晚把希尔排序写错而误以为其效率高过快速排序的糗事,今天一一做了更正和说明,如果你绝得本随笔不是很妥可以尝试看看这http://www.cnblogs.com/maxiaofang/p/3382927.html,有错误或不妥欢迎指正!!共同学习,共同进步!O(∩_∩)O哈哈~ 推荐一段博友分享的排序视频很艺术.很形象.很生动哦(http://www.oschina.net/question/561584_65522) 最近一段时间去武汉参加

Hark的数据结构与算法练习之希尔排序

算法说明 希尔排序是插入排序的优化版. 插入排序的最坏时间复杂度是O(n2),但如果要排序的数组是一个几乎有序的数列,那么会降低有效的减低时间复杂度. 希尔排序的目的就是通过一个increment(增量)来对数列分组进行交换排序,最终使数列几乎有序,最后再执行插入排序,统计出结果. 通过increment=n/2, 也就是如果9个数的话,增量为4,2,1.   如果是20个数的话,增量就是10,5,2,1.  当increment为1时,其实对几乎有序的数列进行插入排序啦啦. 时间复杂度 O(n

数据结构之---C语言实现希尔排序

//希尔排序Shell Sort //杨鑫 #include <stdio.h> #include <stdlib.h> void ShellSort(int a[], int length) { int increment; int i,j; int temp; for(increment = length/2; increment > 0; increment /= 2) //用来控制步长,最后递减到1 { // i从第step开始排列,应为插入排序的第一个元素 // 可

野生前端的数据结构练习(10)希尔排序,归并排序,快速排序

一.希尔排序 shell sort也称缩小增量排序,是对插入排序算法的改进,其工作原理是定义一个间隔序列来表示排序过程中进行比较的元素之间有多远的间隔,每次将具有相同间隔的数分为一组,进行插入排序,大部分场景中,间隔是可以提前定义好的,也可以动态生成.在较大的数据集上,希尔排序对于插排的优化效果是非常明显的. ./** * 希尔排序示例代码 */ function shellSort(gaps, arr) { for(let g = 0; g < gaps.length; g++){ let h

数据结构和算法基础之希尔排序

/// <summary> /// 希尔排序 /// 属于插入类排序,是将整个无序列分割成若干小的子序列分别进行插入排序 /// 排序过程:先取一个正整数d1<n, /// 把所有序号相隔d1的数组元素放一组,组内进行直接插入排序: /// 然后取d2<d1, /// 重复上述分组和排序操作:直至di=1,即所有记录放进一个组中排序为止 /// </summary> /// <param name="arry"></param>

数据结构与算法——插入排序与希尔排序

void Insertsort(int a[], int n){    int i, j;    int Tmp;    for (i = 1; i < n; i++)//from the second element        for (j = i - 1; j >= 0 && a[j] > a[j + 1]; j--){  //from the i-1 begin to compare until the first element             Tmp

排序 之 冒泡排序 简单选择排序 直接插入排序 希尔排序

排序的基本概念 假设含有n个记录的序列为{r1,r2,--,rn},其相应的关键字分别为{k1,k2,--,kn},需确定1,2,--,n的一种排序p1,p2,--,pn,使其相应的关键字满足kp1≤kp2≤--≤kpn非递减(或非递增)关系,即使得序列称为一个按关键字有序的序列{rp1,rp2,--,rpn},这样的操作就称为排序. 排序的稳定性 假设ki=kj(1≤i≤n,1≤j≤n,i≠j),且在排序前的序列中ri领先于rj(即i<j).如果排序后ri仍领先于rj,则称所用的排序方法是稳定