C 实现主流的几个排序算法

排序算法是笔试中常考的题目,很多面试者背了整个算法代码,过一段时间就又忘记了. 面试者在面试过程中往往处于一种比较紧张的状态, 若对代码不是很熟悉的话, 基本很难完整编写排序算法代码.

小编最近也在看工作机会,于是用C++实现了主流的几个排序算法.

包括:

冒泡排序

选择排序

插入排序

希尔排序

归并排序

快速排序

1. 冒泡排序

冒泡排序是每循环一次选择最大(最小)的值放在最右边,即重复地走访过要排序的数列,一次比较两个元素,如果它们顺序错误,就交换位置.

代码:

// 冒泡排序void BubbleSort(vector<int> &vec){ int l1 = vec.size(); for(int i =0;i<l1;i++) for(int j =0;j<l1-i-1;j++) { if(vec[j]>vec[j+1]) { int temp = vec[j+1]; vec[j+1] = vec[j]; vec[j] = temp; } }}

2. 选择排序

选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

// 选择排序void SelectionSort(vector<int> &vec){    int l1 = vec.size();    for(int i = 0;i < l1-1;i++)    {        for(int j = i+1;j < l1;j++)        {            // 找最小值            if(vec[i] > vec[j]){                int temp = vec[j];                vec[j] = vec[i];                vec[i] = temp;            }        }    }}

3. 插入排序

插入排序(Insertion-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.

// 插入排序,优化void InsertionSort(vector<int> &vec){ int l1 = vec.size(); for(int i=1;i<l1;i++) { int temp = vec[i]; int j = i-1; while(j>=0 && vec[j]>temp) { vec[j+1] = vec[j]; j = j-1; } vec[j+1] = temp; }}

4. 希尔排序

希尔排序(Shell-sort)是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序

// 希尔排序,优化void ShellSort(vector<int> &vec){    int l1 = vec.size();    //增量逐渐减小    for(int gap = l1/2;gap>=1;gap/=2)    {        // 遍历        for(int i =gap;i<l1;i++)        {            //插入排序            int temp = vec[i];            int j = i -gap;            while(j>=0 && vec[j]>temp)            {                vec[j+gap] = vec[j];                j = j -gap;            }            vec[j+gap] = temp;        }    }}

5. 归并排序

归并排序(Merge-sort)是是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案'修补'在一起,即分而治之)。

// 拆分void MySort(vector<int> &vec,const int &first,const int &last){ //// int middle = (first + last)/2; if(first < last) { int middle = (first + last)/2; MySort(vec,first,middle); MySort(vec,middle+1,last); // 并        MergeVector(vec,first,middle,last); }}
// 合并向量2,已知合并向量的长度void MergeVector(vector<int> &vec,const int &first,const int &middle,const int &last){ vector<int> vec3; int i = first; // 合并两个向量 int j = middle + 1; // 找到插入点 while(i<=middle && j<=last) { if(vec[i]>vec[j]){ vec3.push_back(vec[j]); j++; } else { vec3.push_back(vec[i]); i++; } } if(i==middle+1) { for(int k=j;k<=last;k++) vec3.push_back(vec[k]); } else { for(int k=i;k<=middle;k++) vec3.push_back(vec[k]); } // 赋值 for(int i=first;i<=last;i++) vec[i] = vec3[i-first];}

6. 快速排序

快速排序(Quick-sort)的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

// 快速排序void QuickSort(vector<int> &vec,const int&first,const int&last){    //    if(first < last)    {        //        int middle = (first + last)/2;        // 分        QuickSort(vec,first,middle);        QuickSort(vec,middle+1,last);        QuickSortSupplement(vec,first,last);    }}void QuickSortSupplement(vector<int> vec,const int&first,const int&last){    int middle = first;    int key = vec[middle];    int i = first;    int j = first + 1;    while(j<=last){        if(key>vec[j])        {            //放参考值左边            int temp = key;            vec[i] = vec[j];            i++;            vec[i] = temp;        }        j++;    }}
(0)

相关推荐

  • 算法题:二叉树的垂序遍历

    描述 给你二叉树的根结点 root ,请你设计算法计算二叉树的 垂序遍历 序列. 对位于 (row, col) 的每个结点而言,其左右子结点分别位于 (row 1, col - 1) 和 (row 1 ...

  • 十种排序算法总结(冒泡、插入、选择、希尔、归并、堆、快速,计数,桶,基数)

    #include<iostream> using  namespace std; void swap1( int *left,  int *right) {      int temp = ...

  • 七大排序算法总结

    以下所有动图均来源于一像素博客园 以下代码均使用C 编写 完整代码请到这里下载 稳定排序算法:冒泡排序.插入排序.归并排序 时间复杂度不受数据影响:选择排序.归并排序.堆排序 时间复杂度基本小于n2: ...

  • 图解七大排序算法

    "排序是计算机的核心内容.事实上,从很多方面看,如果没有排序,计算机就不会变成现实." <算法之美:指导工作与生活的算法> 排序算法,或许是我们日常最常见也是使用频率最 ...

  • Java排序算法(四)希尔排序2

    希尔排序移步法:分组+直接插入排序组合 一.测试类SortTest import java.util.Arrays; public class SortTest { private static fi ...

  • 十大经典排序算法(动图演示)

    0.算法概述 0.1 算法分类 十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序. 非比较类排序: ...

  • 关于排序算法,看这一篇就够了!这篇看不懂麻烦找我拿红包

    排序算法是<数据结构与算法>中最基本的算法之一. 排序算法可以分为内部排序和外部排序. 内部排序是数据记录在内存中进行排序. 而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排 ...

  • 十大排序算法详解,基本思想+动画演示+C语言实现,太肝了!

    下面的99%的代码都是手动敲出来的,参考了诸多资料,已经经过测试,可以放心食用. 1.冒泡排序 基本思想 冒泡排序基本思想是依次比较两个相邻的元素,如果顺序(如从大到小.首字母从Z到A)错误就把他们交 ...

  • c语言必会排序算法集(含代码解析)

      一.冒泡排序 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法. 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小.首字母从A到Z)错误就 ...

  • 汽车之家推荐系统排序算法迭代之路

    文章作者:李晨旭 汽车之家 出品平台:DataFunTalk 导读:汽车之家的推荐系统紧随前沿技术,在支持内部多个推荐场景的同时,对外也有了一定的输出.未来我们期望汽车之家的推荐系统不只是前沿技术的应 ...