排序(sort)

排序的目的是让一组无序的对象变成有序(升序、降序),排序在面试中很容易被问道。排序之所以这么重要是因为排序是解决大部分问题的第一步,一些看似复杂的问题当数据有序的时候就变的简单,例如查找问题,如果数组有序可以使用搞笑的折半查找。

需要提出,这篇文章并不介绍排序,什么插入、冒泡、希尔等算法,我们都不会介绍,我们的目的是给出最常见的关于排序的面试题目,俗称押题,当然希望每个人都能研究每一个题目,在面试过程中遇到排序问题,都可以解决。

1. 快速排序

题目: 这是面试中最常见的问题,手写快排,面试官主要是考查候选人的算法基本工。
公司: 爱奇艺,某金融公司

template<class T>
static bool cmp(const T a, const T b) {return a < b;
}template<class T>
int Poivt(T list[], int start,int end, bool (*cmp)(T, T)=cmp) {int t = randint(start, end);swap(list[t],list[start]);int p,i,j;i = start+1;j = end;p = start;while(1) {while(i<end && cmp(list[i],list[p])) ++i;while(j>start && !cmp(list[j],list[p])) --j;if(j<=i) break;else{swap(list[i],list[j]);++i;--j;}}swap(list[j],list[p]);return j;
}// qsort
template<class T>
void QuickSort(T list[], int start,int end, bool (*cmp)(T, T)=cmp) {if(start>=end) return;int p = Poivt(list,start,end,cmp);QuickSort(list,start,p-1,cmp);QuickSort(list,p+1,end,cmp);
}

2. 堆排序

题目: 手写堆排序
公司: 阿里

// 第一步建立最大堆, 下标从1开始 A[1..n]
void BuildMaxHeap(int *A, int n, int &heapsize){heapsize=n; //全局变量,表示最大堆的大小for(int i = n/2; i > 1; i --){        MaxheapFY(A, i);}
}// heapsort
void HeapSort(int *A,int n){BuildMaxHeap(A,n);//建立最大堆for(int i = n;i >= 1;i --){swap(A[0],A[i]);        heapsize --;MaxheapFY(A, 1);}
}// 维护位置i最大堆的性质
void MaxheapFY(int *A, int i){int l,r,now;l = i * 2;r = i * 2 + 1;now = i;if(l <= heapsize && A[l] > A[now]) {now = l;}if(r <= heapsize && A[r] > A[now]){now = r;}if(now != i){swap(A[i], A[now]);MaxheapFY(A, now);    }
}

3. 归并排序

题目: 手写归并排序

template<class T>
void Merge(T list[], int start, int mid, int end, bool (*cmp)(T, T)=cmp) {T *temp = new T[end-start+1];int i=start,j=mid+1,k=0;while(i<=mid && j<=end) {if(cmp(list[i],list[j])) temp[k++] = list[i++];else temp[k++] = list[j++];}while(i<=mid) {temp[k++] = list[i++];}while(j<=end) {temp[k++] = list[j++];}// copy for(i=start;i<=end;i++){list[i] = temp[i-start];}delete [] temp;
}// MergeSortUtil
template<class T>
void MergeSortUtil(T list[], int start,int end, bool (*cmp)(T, T)=cmp) {if(start>=end) return;int mid = (start+end) / 2;MergeSortUtil(list,start,mid,cmp);MergeSortUtil(list,mid+1,end,cmp);Merge(list,start,mid,end,cmp);
}

4. 实现多路归并排序

题目: 实现常用的多路归并排序(使用最大堆,或者优先队列)
公司: 百度,360

// vec中每一个vector都是有序的
vector<int> MultMerge(vector<vector<int> > vec, vector<int> &result) {int n = vec.size();priority_queue<int, vector<int>, greater<int> > q;vector<vector<int>::iterator> vec_it;for(int i = 0; i < n; i ++) {vector<int>::iterator it = vec[i].begin();vec_it.push_back(it);}for(int i = 0; i < n; i ++) {if(q.size() < k && vec_it[i] != vec[i].end()) {q.push(*(vec_it[i]));}}while(q.size()) {int cand = q.top();q.pop();result.push_back(cand);int index = 0;for(int i = 0; i < n; i ++) {if(vec_it[i] != vec[i].end() && cand == *(vec_it[i])) {index = i;vec_it[index] ++;break;}}if(vec_it[index] != vec[index].end()) {q.push(*(vec_it[index]));}}return result;
}

5. 单链表插入排序

题目: 单链表的插入排序(升序)。
公司: 百度

struct Node {int data;struct Node * next;
};void InsertLinked(Node** sorted, Node* tmp) {Node* cur;// 当前插入节点是最小的值if(*sorted == NULL || tmp->data <= (*sorted)->data) {tmp->next = *sorted;*sorted = tmp;}else { // 找到插入的位置cur = *sorted;while(cur->next != NULL && tmp->data > cur->next->data) {cur = cur->next;}tmp->next = cur->next;cur->next = tmp;}
}void InsertSort(Node** head) {// 有序链表Node *sorted = NULL;Node * cur = *head;while(cur != NULL) {Node *next = cur->next;// 将cur插入到sorted中,这是一个有序的链表InsertLinked(&sorted, cur);cur = next;}*head = sorted;
}

6. 单链表归并排序

题目: 单链表的归并排序。
公司: 百度

void MergeSort(Node **head_ref) {Node *head  = *head_ref;Node *left;Node *right;// 判断是否是nullif(head == NULL || head->next == NULL) {return;}// 链表分成两个部分,left 和 rightsplit(head, &left, &right);MergeSort(left);MergeSort(right);*head_ref = Merge(left, right);
}// 左右各一半,
void split(Node *head, Node **left, Node **right) {//1. 先计算长度n,分别选择前一半和后一半。//2. 使用快慢指针,各取一半int n = 0;Node *cur = head;while(cur != NULL) {n ++;}*left = head;int k = n / 2;cur = head;Node *p = NULL;while(k--) {p = cur;cur = cur->next;}p->next = NULL;*right = cur;
}Node* Merge(Node *left, Node *right) {// merge right to leftNode *head = NULL;head->data = -1;Node *p = head;    while(left != NULL && right != NULL) {if(left->data <= right->data) {p->next = left;left = left->next;}else {p->next = right;right = right->next;}p = p->next;}if(left != NULL) {p->next = left;}if(right != NULL) {p->next = right;}return head->next;
}

Coding-排序(sort)相关推荐

  1. Python编程基础:第五十四节 排序Sort

    第五十四节 排序Sort 前言 实践 前言 我们常需要对列表.元组中的元素进行排序,例如按照字母表排列学生的名称.这里就需要用到列表的sort()方法,以及sorted()函数. 实践 我们先来构建一 ...

  2. [转载]详细解说STL排序(sort)------这篇博文在一道题上救了我o_0

    详细解说 STL 排序(Sort) 作者Winter 原文地址:http://www.cppblog.com/mzty/archive/2005/12/15/1770.html 详细解说 STL 排序 ...

  3. Numpy 排序 -- sort()、argsort()

    Numpy 排序 – sort().argsort() 官方文档 1.内容排序:sort() 函数原型: 对数组本身进行排序 numpy.sort(a, axis=-1, kind='quicksor ...

  4. Python 排序 -- sort()、sorted()

    Python 排序 – sort().sorted() 1. 列表排序:sort() 函数原型: 直接对列表本身进行排序,不会返回新的列表 list.sort(cmp=None, key=None, ...

  5. SAP UI5 初学者教程之二十三 - 列表控件的排序 Sort 和分组 Group 试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 初学者教程之一:Hello World SAP UI5 初学者教程之二:SAP UI5 ...

  6. C++ 二维vector排序(sort用法)

    C++二维vector排序 sort 函数的使用 sort 函数的使用 自定义排序函数 (目标:对 二维vector<vector> points中第二个元素进行排序) static bo ...

  7. 【C++常用函数】数组或vector排序sort()

    sort() #include <iostream>//输入输出 #include <vector> #include<algorithm>//sort方法usin ...

  8. JS数组对象——英文按照首字母进行排序sort()、localeCompare()

    JS数组对象--英文按照首字母进行排序(sort.localeCompare) 上期回顾 场景复现 sort()方法与localeCompare 实例应用 上期回顾 文章内容 文章链接 JS数组对象- ...

  9. linux之排序sort命令详解

    linux之排序sort命令 sort排序规则: 以行为单位,每一行作为一个字符串 按照字符串的比较规则,首字母开始依次向后按ASCII码值进行比较 结果默认升序输出 1. 简单排序 [root@li ...

  10. python基础-列表排序sort和sorted

    [Python基础]列表排序sort和sorted 文章目录 [Python基础]列表排序sort和sorted 1. sort 2. sorted 3. 如何使用sort获得排序后的列表的副本呢? ...

最新文章

  1. linux内核杂记(2)-内核的同步与并发
  2. Struts2-拦截器原理
  3. 【Linux系统编程】进程同步与互斥:POSIX有名信号量
  4. oracle表压缩比,oracle的compress 特性介绍
  5. HDFS文件和HIVE表的一些操作
  6. Allegro 制作 package
  7. class文件不能反编译
  8. shell特殊命令 sort_wc_unip命令
  9. 关于将驱动整合至ESXi镜像过程中的一些小坑
  10. 网络对抗实验报告 | 逆向与Bof基础实验报告
  11. 有了创意和灵感,怎样用科技让它们跃然纸上?
  12. win7+ubuntu16.04以及win10+ubuntu18.04双系统安装
  13. 代码随想录——求根节点到叶节点数字之和
  14. 那些酷炫的网页你也可以做到——第二篇(HTML排版)
  15. 计算墨水污染的格子【非常规墨水污染】
  16. 手机号验证 199号码等
  17. 老司机珍藏的130个网站,没人的时候偷偷看!
  18. 飞书机器人python给用户发信息api调用
  19. 在线抓娃娃的基本技术架构
  20. 关于Altium designer中45°、90°及圆弧线的切换

热门文章

  1. JavaScript获取当前日期,昨天,今天日期以及任意天数间隔日期
  2. 使用java的Calendar对象获得当前日期的上几个度开始、结束时间
  3. petaPar培训文档
  4. OPENGL ES 对象的拾取
  5. vs2008 常用快捷键
  6. 07 Scratch等级考试(一级)模拟题
  7. Numpy入门教程:08. 集合操作
  8. C#语言与面向对象技术(4)
  9. 编程基础知识科普:C#中的问号运算符
  10. 400 多行代码!超详细 Rasa 中文聊天机器人开发指南 | 原力计划