常用数据结构和算法系列(一)--排序、回溯

十大排序算法总结

查找和排序算法是算法的入门知识,也经常在面试中出现,要求现场写代码,因此熟悉常用的排序思想和代码很重要。主要的排序方法有冒泡排序、直接插入排序、选择排序、快速排序、归并排序、堆排序、希尔排序、计数排序、桶排序、基数排序。

直接插入排序

  • 算法思想
    整个排序过程是n-1趟插入,即先将序列中第一个数字看成是有序数据,然后从第2个数据开始,逐个进行插入,直至整个序列有序。如下图:
  • 实现代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    #include <iostream>
    using namespace std;

    void helpCout(int* nums, int n)
    {
    for(int i=0; i<n; i++)
    {
    cout<<nums[i]<<" ";
    }
    cout<<endl;
    }
    // ********** 直接插入排序 **********
    // 数组
    void insertSort(int* nums, int n)
    {
    for(int i=0; i<n; i++)
    {
    int j = i;
    int insert = nums[i];
    while(j>0 and nums[j-1] > insert)
    {
    nums[j] = nums[j-1];
    j--;
    }
    nums[j] = insert;
    }
    }

    int main()
    {
    int nums[] = {2,5,1,7,3,9,5,0};
    cout<<"nums: ";
    int n = sizeof(nums)/ sizeof(nums[0]);
    helpCout(nums, n);
    insertSort(nums, n);
    cout<<"sort result: "<<endl;
    helpCout(nums, n);
    }

运行结果

1
2
3
nums: 2 5 1 7 3 9 5 0 
sort result:
0 1 2 3 5 5 7 9

希尔排序

  • 算法思想
    希尔排序的基本思想是对待排序列先做“宏观”调整,再作“微观”调整。“宏观”指的是跳跃式的插入排序。
  • 实现代码

    1
     

交换排序

交换排序的基本思想是两两比较待排序对象的数值,如果发生逆序,则交换,直到所有排序对象都排好序为止。交换排序主要有冒泡排序和快速排序。

冒泡排序

  • 算法思想
    第一趟:第1个数与第2个数比较,大则交换;第2个数与第3个数比较,大则交换;…;第n-1个数与第n个数比较,大则交换;第n个位置得到最大的数;
    第二趟:对前n-1个数进行同样的操作,第n-1个位置得到次大的数,此时第n-1个数和第n个数已经排好序;
    以此类推,n-1趟完成排序。

  • 实现代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
      // ************* 冒泡排序 **************
    void bubble(int* nums, int n)
    {
    for(int i=1; i<n; i++)
    {
    int j = 0;
    while(j<n-i)
    {
    if(nums[j] > nums[j+1])
    {
    int tmp = nums[j+1];
    nums[j+1] = nums[j];
    nums[j] = tmp;
    }
    j++;
    }
    }
    }

快速排序

  • 算法思想

  • 实现代码

    1
     

选择排序

  • 算法思想

  • 实现代码

    1
     

归并排序

  • 算法思想

  • 实现代码

    1
     

堆排序

  • 算法思想

  • 实现代码

    1
     

计数排序

  • 算法思想

  • 实现代码

    1
     

桶排序

  • 算法思想

  • 实现代码

    1
     

基数排序

  • 算法思想

  • 实现代码

    1
     

回溯算法总结

参考资料

0%