sort

数据结构:堆

随声附和 提交于 2020-02-01 23:02:01
堆(一种完全二叉树) 大顶堆 :父亲节点的指大于等于孩子结点的值 小顶堆 :父亲节点的值小于等于孩子结点的值 用处:优先队列的实现 对于一个给定初始序列,调整为堆的方法:从下到上,从右到左,如果有调整,在新位置看看有没有其他调整。 //堆的数据结构实现(数组实现) const int maxn=100;//最大结点数 int heap[maxn]; int n= 10;//n为当前用的节点个数,可以更改 //建堆的过程是向下调整,写的是大顶堆的 void downAdjust(int low,int high)//low为开始结点,high为结束结点 { int i=low;/欲调整结点 int j=i*2; while(j<=high)//孩子结点在范围内 { //确认左孩子右孩子的大小 if(j+1<=high&&heap[j]<heap[j+1]) j=j+1; if(heap[i]<heap[j]) { swap(heap[i],heap[j]);//交换两个结点的值 //更新i,j为下次循环做准备 i=j; j=2*i; } else break; } } //建堆,根据从下往上,从左往右的原则,所以倒着调整,非叶子结点的个数是n/2,从1开始为有效值 void create() { for(int i=n/2;i>=1;i--) { downAdjust(i,n); }

javascript数组的排序(sort,冒泡)

那年仲夏 提交于 2020-02-01 09:31:07
一、js的sort()方法 var arr = [10, 20, 1, 2]; arr.sort(function(a,b){ if(a<b){ return -1; } if(a>b){ return 1; } return 0; }) console.log(arr); //[1, 2, 10, 20] 如上面代码,按照正序(由小到大)排列。通常规定,如果a<b,则返回-1;如果a>b,则返回1;如果a==b,则返回0; 倒序相反。 var arr = [10, 20, 1, 2]; arr.sort(function(a,b){ return a-b; }) console.log(arr); //[1, 2, 10, 20] 该段排序代码效果同上段代码。 二、冒泡排序 var arr = [10, 20, 1, 2]; var t; for(var i=0;i<arr.length;i++){ for(j=i+1;j<arr.length;j++){ if(arr[i]>arr[j]){ t=arr[i]; arr[i]=arr[j]; arr[j]=t; } } } console.log(arr); //[1, 2, 10, 20] 三、二维数组的排序(sort,冒泡) 1.二维数组使用sort()方法排序 var arr=[ ["北京",80], ["上海",50],

mapreduce shuffle 和sort 详解

拈花ヽ惹草 提交于 2020-01-31 03:58:51
MapReduce 框架的核心步骤主要分两部分:Map 和Reduce。当你向 MapReduce 框架提交一个计算作业时,它会首先把计算作业拆分成若干个Map 任务,然后分配到不同的节点上去执行,每一个Map 任务处理输入数据中的一部分,当Map 任务完成后,它会生成一些中间文件,这些中间文件将会作为Reduce 任务的输入数据。Reduce 任务的主要目标就是把前面若干个Map 的输出汇总到一起并输出。 本文的重点是剖析 MapReduce 的核心过程—— Shuffle 和 Sort 。在本文中, Shuffle 是指从Map 产生输出开始,包括系统执行排序以及传送Map 输出到Reducer 作为输入的过程。在这里我们将去探究 Shuffle 是如何工作的,因为对基础的理解有助于对 MapReduce 程序进行调优。 首先从Map 端开始分析。 当Map 开始产生输出时,它并不是简单的把数据写到磁盘,因为频繁的磁盘操作会导致性能严重下降。它的处理过程更复杂,数据首先是写到内存中的一个缓冲区,并做了一些预排序,以提升效率。 每个Map 任务都有一个用来写入输出数据的循环内存缓冲区。这个缓冲区默认大小是100MB,可以通过 io.sort.mb 属性来设置具体大小。当缓冲区中的数据量达到一个特定阀值( io.sort.mb * io.sort.spill.percent ,其中

【JavaScript】数组sort()方法

一个人想着一个人 提交于 2020-01-31 02:48:39
sort() 方法用于对数组的元素进行排序 在默认情况下,sort()方法按升序排列数组项——即最小的值位于最前面,最大的值排在最后面。为了实现排序,sort()方法会调用每个数组项的 toString()转型方法,然后比较得到的字符串,以确定如何排序。即使数组中的每一项都是数值,sort()方法比较的也是字符串 var values = [ 0 , 1 , 5 , 10 , 15 ] ; values . sort ( ) ; // 数值 5 虽然小于 10,但在进行字符串比较时,"10"则位于"5"的前面,于是数组的顺序就被修改了 console . log ( values ) ; //0,1,10,15,5 sort()方法可以接收一个比较函数作为参数,以便我们指定哪个值位于哪个值的前面。比较函数接收两个参数,如果第一个参数应该位于第二个之前则返回一个负数,如果两个参数相等则返回 0,如果第一个参数应该位于第二个之后则返回一个正数。 function compare ( value1 , value2 ) { if ( value1 < value2 ) { return - 1 ; } else if ( value1 > value2 ) { return 1 ; } else { return 0 ; } } var values = [ 0 , 1 , 5 , 10

冒泡排序Bubble Sort

跟風遠走 提交于 2020-01-31 00:17:11
1 #include<iostream> 2 #include<iomanip> 3 #include<time.h> 4 using namespace std; 5 const int N=10; 6 7 void BubbleSort(int arr[], int n) 8 { 9 int i, j, t; 10 for(i=0;i<n-1;i++) 11 { 12 for(j=0;j<n-i-1;j++) 13 { 14 if(arr[j]>arr[j+1]) 15 { 16 t=arr[j+1]; 17 arr[j+1]=arr[j]; 18 arr[j]=t; 19 } 20 } 21 } 22 } 23 24 int main() 25 { 26 int a[N], i; 27 srand(time(NULL)); 28 for(i=0;i<N;i++) 29 a[i]=rand()%100; 30 for(i=0;i<N;i++) 31 cout<<setw(4)<<a[i]; 32 cout<<endl; 33 34 BubbleSort(a,N); 35 for(i=0;i<N;i++) 36 cout<<setw(4)<<a[i]; 37 cout<<endl; 38 } #include<stdio.h> #include<stdlib.h>

sort的使用

我只是一个虾纸丫 提交于 2020-01-30 18:21:30
sort主要是用来排序的,可以用自定义的函数进行比较,也可以用系统的4中函数进行比较,即less(),greater(),less_equal(),greater_equal().但是我试了一下,发现dev和codeblocks都不支持这四种函数,所以放弃了,还是自定义比较靠谱,下面是几种排序方法,仅供参考 代码: #include <bits/stdc++.h> using namespace std; bool my_less(int i,int j){ return i<j; //自定义从小到大排序 } bool my_greater(int i,int j){ return i>j; //自定义从大到小排序 } int main() { int b[8] = {3,7,2,5,6,8,5,4}; vector<int>a(b,b+8); sort(a.begin(),a.begin()+4); sort(a.begin(),a.end()); sort(a.begin(),a.end(),less<int>()); sort(a.begin(),a.end(),my_less); sort(a.begin(),a.end(),greater<int>()); sort(a.begin(),a.end(),my_greater); for(int i = 0;i < a

Hadoop集群大数据解决方案之核心组件MapReduce(四)

时光总嘲笑我的痴心妄想 提交于 2020-01-30 08:26:08
前言    当今天下,大数据组件百花齐放,满足不同应用场景的计算框架层出不穷,mapreduce似乎早已很难有一席之地,但是天下武功,殊途同归,不管怎么变化,都离不开mapreduce的基础,今天,就一起揭开下最原始的计算框架mapreduce的面纱。 核心设计理念    分布式计算,即移动计算 而不移动数据。 原理剖析    如图1,官方给出的mapreduce剑谱,一招一式,尽显奥妙无穷,整体个人觉得分为4部分,split阶段,map阶段,shuffle阶段,reduce阶段,具体如下: 图1 官方mapreduce原理图谱 Split阶段    Map阶段之前还有个准备,就是split,中文意思就是分片,顾名思义就是当一个大文件要进行mapreduce计算时,假设2T,不可能把2T文件全部加载到内存,先要对文件进行切割,就是对应的split操作,那切割成多大才合理呢?split有个原理公式: long minSize = Math . max ( getFormatMinSplitSize ( ) , getMinSplitSize ( job ) ) ; long maxSize = getMaxSplitSize ( job ) ; long blockSize = file . getBlockSize ( ) ; long splitSize =

算法导论笔记

为君一笑 提交于 2020-01-30 02:22:30
算法导论笔记 第2章 2.1插入排序 输入: n个数的一个序列。 输出: 单调递增的数列。 伪码: INSERTION - SORT ( A ) // 1 for j = 2 to A . length 2 key = A [ j ] 3 // Insert A[j] into the sorted sequence A[1 .. j - 1] 4 i = j - 1 5 while i > 0 and A [ i ] > key 6 A [ i + 1 ] = A [ i ] 7 i = i - 1 8 A [ i + 1 ] = key 插入排序算法的简单c语言实现: void insertion_Sort ( int A_lengh ) { int j , i , key ; for ( j = 1 ; j <= A_lengh ; j ++ ) { key = A [ j ] ; i = j - 1 ; while ( i >= 0 && A [ i ] > key ) { A [ i + 1 ] = A [ i ] ; i = i - 1 ; } A [ i + 1 ] = key ; } } 图片描述 来源: CSDN 作者: 大脸蛋子 链接: https://blog.csdn.net/qq_41256768/article/details/104109553

归并排序——Java

拈花ヽ惹草 提交于 2020-01-30 00:18:24
文章目录 归并排序 原地归并的抽象方法 自顶向下的归并排序 自底向上的归并排序 三项优化 归并排序 两个有序数组归并成一个更大的有序数组,就叫归并。 归并排序 是一种递归排序算法,就对一个数组来说,可以先将它(递归地)分成两半分别排序,然后将结果归并起来。 时间复杂度:O(NlogN) 空间复杂度:T(N) 原地归并的抽象方法 两个不同的有序数组如何实现归并? 一个最简单直接地方法就是创建一个最够大的第三数组,然后将两个有序数组的元素从大到小的排到第三数组中,这就叫原地归并。 /** * 原地归并的抽象方法 * 归并,数组两边一定要是有序的 */ public static void merge ( Comparable [ ] a , int lo , int mid , int hi ) { //将a[lo..mid]和a[mid+1..hi]归并 int i = lo , j = mid + 1 ; //将a[lo..hi]复制到aux[lo..hi] for ( int k = lo ; k <= hi ; k ++ ) { aux [ k ] = a [ k ] ; } //归并回到a[lo..hi] for ( int k = lo ; k <= hi ; k ++ ) { if ( i > mid ) { a [ k ] = aux [ j ++ ] ; } else

排序算法-希尔排序(Shell Sort)

自作多情 提交于 2020-01-29 16:37:12
文章目录 希尔排序法介绍 希尔排序法算法 时间复杂度 稳定性 其他排序法的比较 希尔排序法介绍 希尔排序法(Shell Sort)是 D.L.Shell 于1959年提出的一种排序算法,是 直接插入排序法 的更高效的改进版。在这之前的排序算法如 冒泡排序 、 简单选择排序 、 直接插入排序 等算法的的时间复杂度都为 O ( n 2 ) O(n^{2}) O ( n 2 ) ,而希尔排序突破了这一时间复杂度。 【原理】 直接插入排序算法比冒泡排序和简单选择排序性能都要高,尤其在序列基本有序并且记录数相对较少的情况,只需要简单的几个插入动作就能完成排序。 希尔排序的思路就是在插入排序算法的基础上,创造插入排序算法的有利条件,将序列按照某个增量分成多个子序列进行插入排序,使整个序列变为基本有序,并且由于按照增量分了子序列,所以每个子序列的记录数变少了,增量和子序列长度成反比,增量从小于n的某个值每次递减,子序列随增量变小而变长。直到增量变为1,使其所有记录为一个整体序列然后进行一次插入排序为止。 什么才叫基本有序呢?比如{2,1,4,3,5,6,8,7,9}可以说是基本有序,小的数字基本在序列的前部,不大不小的在中部,大的数字在后部。 {8,7,6,3,9,2,4,5,1}这样的序列就不是基本有序,因为1在序列的最后,9在中间,8在第一位,所以谈不上是基本有序的。 【例子】