面试必考三大排序算法C++代码(快速排序、归并排序、堆排序)

前两个为C++风格代码,后一个为C风格代码,除了输入输出,其它无差别,但C输入输出要比C++更快。

快速排序

 1 #include <iostream>
 2 using namespace std;
 3
 4 void swap(int num[], int i, int j)
 5 {
 6     int temp = num[i];
 7     num[i] = num[j];
 8     num[j] = temp;
 9 }
10
11 int partition(int num[], int left, int right)
12 {
13     int key = left;
14     int value = num[key];
15     while (left < right)
16     {
17         while (left < right && num[right] >= value)right--;
18         while (left < right && num[left] <= value)left++;
19         swap(num, right, left);
20     }
21     swap(num, key, left);
22     return left;
23 }
24
25 void QuickSort(int num[], int begin, int end)
26 {
27     if (begin < end)
28     {
29         int middle = partition(num, begin, end);
30         QuickSort(num, begin, middle - 1);
31         QuickSort(num, middle + 1, end);
32     }
33 }
34
35 int main()
36 {
37     int num[100];
38     int n = 0;
39     while (cin >> n)
40     {
41         for (int i = 0; i < n; i++)
42         {
43             int temp = 0;
44             cin >> temp;
45             num[i] = temp;
46         }
47         QuickSort(num, 0, n - 1);
48         for (int i = 0; i < n; i++)
49             cout << num[i] << " ";
50         cout << endl;
51     }
52     return 0;
53 }

归并排序

 1 #include <iostream>
 2 using namespace std;
 3
 4 void Merge(int *from, int *to, int begin, int middle, int end)
 5 {
 6     int i = begin;
 7     int j = middle + 1;
 8     int k = i;
 9     while (i <= middle && j <= end)
10     {
11         if (from[i] < from[j])
12             to[k++] = from[i++];
13         else to[k++] = from[j++];
14     }
15     while (i <= middle) to[k++] = from[i++];
16     while (j <= end) to[k++] = from[j++];
17 }
18
19 void MergePass(int *from, int *to, int end, int h)
20 {
21     int i = 0;
22     while (i <= end - 2 * h + 1)
23     {
24         Merge(from, to, i, i + h - 1, i + 2 * h - 1);
25         i += 2 * h;
26     }
27     if (i < end - h + 1)
28         Merge(from, to, i, i + h - 1, end);
29     else
30         for (int k = i; k <= end; k++)
31         {
32             to[k] = from[k];
33         }
34 }
35
36 void MergeSort(int *from, int *to, int begin, int end)
37 {
38     int h = 1;
39     while (h <= end)
40     {
41         MergePass(from, to, end, h);
42         h = 2 * h;
43         MergePass(to, from, end, h);
44         h = 2 * h;
45     }
46 }
47
48 int main() {
49     int num[100];
50     int num2[100];
51     int n = 0;
52     while (cin >> n)
53     {
54         for (int i = 0; i < n; i++)
55         {
56             int temp = 0;
57             cin >> temp;
58             num[i] = temp;
59         }
60         MergeSort(num, num2, 0, n - 1);
61         for (int i = 0; i < n; i++)
62             cout << num[i] << " ";
63         cout << endl;
64     }
65     return 0;
66 }

堆排序

 1 #include <stdio.h>
 2
 3 void HeapAdjust(int *num, int s, int length)
 4 {
 5     int temp = num[s];
 6     int child = 2 * s + 1;
 7     while (child < length)
 8     {
 9         if (child + 1 < length && num[child] < num[child + 1])
10             child++;
11         if (num[s] < num[child])
12         {
13             num[s] = num[child];
14             num[child] = temp;
15             s = child;
16             child = 2 * s + 1;
17         }
18         else
19             break;
20     }
21 }
22
23 void buildingHeap(int *num, int length)
24 {
25     for (int i = (length - 1) / 2; i >= 0; --i)
26         HeapAdjust(num, i, length);
27 }
28
29 void HeapSort(int *num, int length)
30 {
31     buildingHeap(num, length);
32     for (int i = length - 1; i > 0; --i)
33     {
34         int temp = num[0];
35         num[0] = num[i];
36         num[i] = temp;
37         HeapAdjust(num, 0, i);
38     }
39 }
40
41 void print(int num[], int n) {
42     for (int i = 0; i < n; i++) {
43         printf("%d ", num[i]);
44     }
45     printf("\n");
46 }
47
48 int main()
49 {
50     int num[100];
51     int n = 0;
52     while (scanf("%d", &n) != EOF)
53     {
54         for (int i = 0; i < n; i++)
55             scanf("%d", &num[i]);
56         HeapSort(num, n);
57         print(num, n);
58     }
59     return 0;
60 }

验证OJ:https://www.nowcoder.com/practice/508f66c6c93d4191ab25151066cb50ef?tpId=69&&tqId=29657&rp=1&ru=/activity/oj&qru=/ta/hust-kaoyan/question-ranking

时间: 2024-10-11 07:12:58

面试必考三大排序算法C++代码(快速排序、归并排序、堆排序)的相关文章

面试常考各类排序算法总结.(c#)

一. 面试以及考试过程中必会出现一道排序算法面试题,为了加深对排序算法的理解,在此我对各种排序算法做个总结归纳. 1.冒泡排序算法(BubbleSort) 1 public Class SortDemo 2 { 3 public void BubbleSort(int arr) 4 { 5 int temp=0; 6 //需要走arr.Length-1 趟 7 for(int i=0;i<arr.Length-1;i++) 8 { 9 //每一趟需要比较次数 10 for(int j=0,j<

【PHP面试题】通俗易懂的两个面试必问的排序算法讲解:冒泡排序和快速排序

又到了金三银四找工作的时间,相信很多开发者都在找工作或者准备着找工作了.一般应对面试,我们无可厚非的去刷下面试题.对于PHPer来说,除了要熟悉自己所做的项目,还有懂的基本的算法.下面来分享下PHP面试中常会问到的算法:冒泡排序和快速排序 冒泡排序:一一对比排序 基本思想: 重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小)错误就把他们交换过来.走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素已经排序完成. 图解: 1.第一次:拿着数组的第一个元素

[面试常考]排序算法总结

排序在各次面试的过程中问道的次数不少,冒泡排序和快速排序尤多.因此做一些总结,尤其是代码部分. 1. 冒泡排序 (1)思想 在一组数中,对当前未排好序的数,自上而下地对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的数往上冒. (2)复杂度 平均情况-O(n^2) 最坏情况-O(n^2)(逆序有序) 最好情况-O(n)(正序有序) 空间复杂度-O(1) (3)稳定性 稳定 (4)伪码 bubblesort(A) { for i=1 to length[A] // 排序的趟数 { for

95%的技术面试必考的JVM知识点都在这,另附加分思路!

概述:知识点汇总 jvm的知识点汇总共6个大方向:内存模型.类加载机制.GC垃圾回收是比较重点的内容.性能调优部分偏重实际应用,重点突出实践能力.编译器优化和执行模式部分偏重理论基础,主要掌握知识点. 各个部分的内容如下: 1>内存模型部分:程序计数器.方法区.堆.栈.本地方法栈的作用,保存哪些数据: 2>类加载部分:双亲委派的加载机制以及常用类加载器分别加载哪种类型的类: 3>GC部分:分代回收的思想和依据,以及不同垃圾回收算法实现的思路.适合的场景: 4>性能调优部分:常用的j

Java BAT大型公司面试必考技能视频-1.HashMap源码分析与实现

视频通过以下四个方面介绍了HASHMAP的内容 一. 什么是HashMap Hash散列将一个任意的长度通过某种算法(Hash函数算法)转换成一个固定的值. MAP:地图 x,y 存储 总结:通过HASH出来的值,然后通过值定位到这个MAP,然后value存储到这个MAP中的HASHMAP基本原理 1. KEY 是否可以为空?可以,Null当成一个Key来存储 2. 如果Hash KEY重复了会覆盖吗?会覆盖,但返回旧的值 3. HASHMAP什么时候做扩容?put 的时候,阀值高于或等于0.7

Python实现各种排序算法的代码示例总结

Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示例总结,其实Python是非常好的算法入门学习时的配套高级语言,需要的朋友可以参考下 在Python实践中,我们往往遇到排序问题,比如在对搜索结果打分的排序(没有排序就没有Google等搜索引擎的存在),当然,这样的例子数不胜数.<数据结构>也会花大量篇幅讲解排序.之前一段时间,由于需要,我复习了

排序算法总结---代码+性能

// data_sort_alg.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "sort_alg.h" #include <iostream> #include <vector> void show(std::vector<int> &a) { std::vector<int>::iterator it=a.begin(); while(it!=a.

各种排序算法的代码

1 // ALLKindsOfSorts.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include "stdafx.h" 5 #include<iostream> 6 #include<vector> 7 #include<bitset> 8 9 using namespace std; 10 11 ////////////////////////////////////////所有的排序总结///////////////////

算法学习?挑战高薪的必经之路!让面试官满意的排序算法(图文解析)

让面试官满意的排序算法(图文解析) 这种排序算法能够让面试官面露微笑 这种排序算法集各排序算法之大成 这种排序算法逻辑性十足 这种排序算法能够展示自己对Java底层的了解 这种排序算法出自Vladimir Yaroslavskiy.Jon Bentley和Josh Bloch三位大牛之手,它就是JDK的排序算法--java.util.DualPivotQuicksort(双支点快排) 想看以往学习内容的朋友可以看我的GitHub:https://github.com/Meng997998/And