当前位置:编程学习 > C/C++ >>

面试算法之排序算法集锦

排序算法在面试过程中是经常会考的,这是很基础的,面试官觉得你应该很熟悉这些东西,如果你半个小时内写不出来,那基本就给跪了,因为这真的是狠基础狠基础的东西,所以我们得对一些基本的排序算法烂熟于胸,对这些排序思想,效率了如指掌,才能让面试官觉得你还行。基本的排序算法有:直接插入排序,冒泡排序,简单选择排序,shell排序,归并排序,快速排序,堆排序。其中归并,快速,堆排序是面试时候比较喜欢考的,因为这三个排序算法都是很重要的算法,会有很多实际的应用。下面就简单的介绍这些排序算法,并给出代码。
 
1.直接插入排序
直接插入排序的思想很简单,就是从排序序列开始,依次将每个元素插入到前面已经排序好的序列中,最终使整个序列有序,直接插入排序的时间复杂度O(n^2),空间复杂度为O(1),代码如下:
 
[cpp]  
/**  
 * Time Complexity:O(n^2) 
 * Space Complexity:O(1) 
 *  
 * sorted data ; array[low...high] 
 */  
template <typename Type>  
void DirectInsertSort(Type array[], int low, int high)  
{  
    if (array == NULL || low >= high || low < 0)  
    {  
        return;  
    }  
  
    Type exchange;  
    int j;  
  
    for (int i = low + 1; i <= high; ++i)  
    {  
        exchange = array[i];  
          
        for (j = i - 1; j >= low; --j)  
        {  
            if (exchange < array[j])  
            {  
                array[j + 1] = array[j];  
            }  
            else  
            {  
                break;  
            }  
        }  
  
        array[j + 1] = exchange;  
    }  
}  
2.冒泡排序
我们对冒泡排序应该都比较深,因为这个名字很形象很好记 。排序的思想就是每个冒泡一遍序列,找出一个最大或最小的元素,放到它排序后的位置上直到序列有序。时间复杂度O(n^2),空间复杂度为O(1),代码如下:
 
[cpp]  
/**  
 * Time Complexity:O(n^2) 
 * Space Complexity:O(1) 
 * 
 * sorted data: array[low...high] 
 */  
template <typename Type>  
void BubbleSort(Type array[], int low, int high)  
{  
    if (array == NULL || low >= high || low < 0)  
    {  
        return;  
    }  
  
    Type exchange;  
    bool change = false;  
  
    for (int i = low; i < high; ++i)  
    {  
        for (int j = low; j < high - i + low; ++j)  
        {  
            if (array[j] > array[j + 1])  
            {  
                exchange = array[j + 1];  
                array[j + 1] = array[j];  
                array[j] = exchange;  
  
                change = true;  
            }  
        }  
  
        if (!change)  
        {//如果冒泡过程中没有发生交换,则视序列已经排好序,减少无谓的比较  
            return;  
        }  
        change = false;  
    }  
}  
3.简单选择排序
简单选择排序的思想就是每次在未排序的序列中选取一个最小(或最大)的元素,放到最终的位置上,时间复杂度O(n^2),空间复杂度为O(1),代码如下:
 
[cpp]  
/**  
 * Time Complexity:O(n^2) 
 * Space Complexity:O(1) 
 *  
 * sorted data ; array[low...high] 
 */  
template <typename Type>  
void SelectSort(Type array[], int low, int high)  
{  
    if (array == NULL || low >= high || low < 0)  
    {  
        return;  
    }  
  
    int index;  
    Type exchange;  
  
    for (int i = low; i < high; ++i)  
    {  
        index = i;  
  
        for (int j = i + 1; j <= high; ++j)  
        {  
            if (array[j] < array[index])  
            {  
                index = j;  
            }  
        }  
  
        exchange = array[i];  
        array[i] = array[index];  
        array[index] = exchange;  
    }  
}  
4.折半插入排序
折半插入排序和直接插入排序的差别就是在查找插入位置的方式上,直接插入排序是顺序查找插入位置,折半插入式通过二分搜索的思想来查找插入位置。总体来说直接插入排序的比较次数为1+2+3...+(n-1) ~ O(n^2),二折半查找的比较次数在lg(n-1)+lg(n-2)+...1~O(lg(n!)) ~O(nlgn)(stirling公式)。所以折半查找的优势是减少了比较次数。代码如下:
 
[cpp]  
/**  
 * Time Complexity:O(n^2) 
 * Space Complexity:O(1) 
 
 * sorted data ; array[low...high] 
 */  
template <typename Type>  
void BinaryInsertSort(Type array[], int low, int high)  
{  
    if (array == NULL || low >= high || low < 0)  
    {  
        return;  
    }  
  
    int left, right, mid, j;  
    Type exchange;  
  
    for (int i = low + 1; i <= high; ++i)  
  &nbs
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,