数据结构和算法

排序算法上——冒泡排序、插入排序和选择排序

2018-10-15  本文已影响99人  seniusen

1. 排序算法?

排序算法应该算是我们最熟悉的算法了,我们学的第一个算法,可能就是排序算法,而在实际应用中,排序算法也经常会被用到,其重要作用不言而喻。

经典的排序算法有:冒泡排序、插入排序、选择排序、归并排序、快速排序、计数排序、基数排序、桶排序。按照时间复杂度,可以分为以下三类。

排序算法

2. 如何分析一个排序算法?

2.1. 排序算法的执行效率

2.2. 排序算法的内存消耗

2.3. 排序算法的稳定性

稳定排序算法

3. 冒泡排序(Bubble Sort)?

3.1. 冒泡排序算法实现

冒泡排序 冒泡排序 冒泡排序
// O(n^2)
void Bubble_Sort(float data[], int n)
{
    int i = 0, j = 0;
    int temp = 0;
    int flag = 0;
    for(i = n-1; i > 0; i--)
    {
        flag = 0;
        for(j = 0; j < i; j++)
        {
            if(data[j+1] < data[j])
            {
                temp = data[j];
                data[j] = data[j+1];
                data[j+1] = temp;
                flag = 1;
            }
        }

        if(!flag)//If no data needs to be exchanged, the sort finishes.
        {
            break;
        }
    }
}

3.2. 冒泡排序算法分析

3.3. 有序度和逆序度

有序度

4. 插入排序(Insertion Sort)

4.1. 插入排序算法实现

// O(n^2)
void Insertion_Sort(float data[], int n)
{
    int i = 0, j = 0;
    int temp = 0;
    for(i = 1; i < n; i++)
    {
        temp = data[i];
        for(j = i; j > 0; j--)
        {
            if(temp < data[j-1])
            {
                data[j] = data[j-1];
            }
            else// The data ahead has been sorted correctly.
            {
                break;
            }
        }
        data[j] = temp; // insert the data
    }
}

4.2. 插入排序算法分析


5. 选择排序(Selection Sort)

5.1. 选择排序算法实现

// O(n^2)
void Selection_Sort(float data[], int n)
{
    int i = 0, j = 0, k = 0;
    int temp = 0;
    for(i = 0; i < n-1; i++)
    {
        k = i;
        for(j = i+1; j < n; j++)
        {
            if(data[j] < data[k])
            {
                k = j;
            }
        }
        if(k != i)
        {
            temp = data[i];
            data[i] = data[k];
            data[k] = temp;
        }
    }
}

5.2. 选择排序算法分析


6. 为什么插入排序比冒泡排序更受欢迎?

交换排序和插入排序的时间复杂度都为 O(n^2),也都是原地排序算法,为什么插入排序更受欢迎呢?

冒泡排序中数据的交换操作:
if (a[j] > a[j+1]) { // 交换
   int tmp = a[j];
   a[j] = a[j+1];
   a[j+1] = tmp;
   flag = true;
}

插入排序中数据的移动操作:
if (a[j] > value) {
  a[j+1] = a[j];  // 数据移动
} else {
  break;
}

7. 小结

三种排序算法对比

参考资料-极客时间专栏《数据结构与算法之美》

获取更多精彩,请关注「seniusen」!


seniusen
上一篇 下一篇

猜你喜欢

热点阅读