经典排序算法解析(三)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析DNS,个人版 1个月
简介: 经典排序算法解析

六、双向冒泡排序


   双向冒泡排序是冒泡排序的一种变体,冒泡排序每次比较都是从左向右,找出最大的放在最后。双向冒泡排序则是第一轮从左向右将最大的放最后,第二轮从右向左将最小的放最首,如此交替直到整个数列排序完成。文字描述双向冒泡排序步骤如下:


1.从左向右依次比较相邻两个元素,如果顺序不对,则进行交换,如此一轮下来,最大的元素在最后。


2.除去已经排序好的元素,从右向左依次比较相邻的两个元素,如果顺序不对,则进行交换,最小的元素在首部。


3.交替重复步骤1与步骤2直到排序完成。


双向冒泡排序示意图如下:

image.png



JavaScript实现的双向冒泡排序算法:


var array = [1,54,2,64,12,65,76,46,34,98];

//双向冒泡排序

var start = 0;

var end = array.length;

while(end-start>0){

//从左向右冒泡

for(var i=start;i<end-1;i++){

 var temp = array[i];

 if (array[i+1]<temp) {

  array[i] = array[i+1];

  array[i+1] = temp;

 }

}

end--;

//从右向左冒泡

for(var j=end;j>start+1;j--){

 var temp = array[j];

 if (array[j-1]>temp) {

  array[j] = array[j-1];

  array[j-1] = temp;

 }

}

start++;

}

console.log(array);//[ 1, 2, 12, 34, 46, 54, 64, 65, 76, 98 ]

C实现的双向冒泡排序算法:


#include <stdio.h>

//双向冒泡排序

void mySort(int array[],int size){

int start = 0;

int end = size;

//从左向右冒泡

for(int i=start;i<end-1;i++){

 int temp = array[i];

 if (array[i+1]<temp) {

  array[i] = array[i+1];

  array[i+1] = temp;

 }

}

end--;

//从右向左冒泡

for(int j=end;j>start+1;j--){

 int temp = array[j];

 if (array[j-1]>temp) {

  array[j] = array[j-1];

  array[j-1] = temp;

 }

}

start++;

}

int main(){

int a[] = {1, 2, 12, 34, 46, 54, 64, 65, 76, 98,33};

mySort(a,11);

for(int i = 0;i<11;i++){

 printf("%d\n",a[i]);

}

return 0;

}

七、快速排序算法


   快速排序算法和基本思路是通过一趟排序将数列分成两部分,其中一部分的所有数据都比另一部分小。之后在分别在两个子数列中进行递归,直到最终排序完成。快速排序算法的核心是递归,因此其效率十分高。用文字描述快速排序的步骤如下:


1.随机取一个元素作为基准,将小于此元素的数据都放在此元素的左侧,大于此元素的数据都放在此元素的右侧,将数列分隔成左右两个子数列。


2.分别对左右子数列进行步骤1的递归,直到数列长度为1或者0,表示排序完成。



image.png

JavaScript实现的快速排序算法:


var array = [1, 54, 2, 64, 12, 65, 76, 46, 34, 98, 34];

//快速排序

function sort(array, left, right) {

if (right - left >= 1) {

 //取第一个元素作为基准

 let base = array[left];

 let i = left + 1;

 let index = left;

 while (i <= right) {

  //大于等于的已经在右边 不需要修改 小于的要放在左边

  if (array[i] < base) {

   if (index + 1 == i) {

    //交换

    array[index] = array[i];

    array[i] = base;

    index++;

   } else {

    //先将base与其后一个元素交换

    array[index] = array[index + 1];

    array[index + 1] = base;

    //交换

    let temp = array[index];

    array[index] = array[i];

    array[i] = temp;

    index++;

   }


  }

  i++;

 }

 //递归排序

 sort(array, left, index - 1);

 sort(array, index + 1, right);

}

}

sort(array, 0, array.length - 1);

console.log(array); //[ 1, 2, 12, 34,34, 46, 54, 64, 65, 76, 98 ]

C语言实现的快速排序:


#include <stdio.h>

//快速排序

void mySort(int array[],int left,int right){

if(right-left>=1){

 int base = array[left];

 int i = left+1;

 int index = left;

 while(i<=right){

  if(array[i]<base){

   if(index+1==i){

    array[index] = array[i];

    array[i]=base;

    index = i;

   }else{

    array[index]=array[index+1];

    array[index+1] = base;

    int temp = array[index];

    array[index] = array[i];

    array[i] = temp;

    index++;

   }

  }

  i++;

 }

 mySort(array, left, index-1);

 mySort(array, index+1, right);

}

}

int main(){

int a[] = {1, 2, 12, 34, 46, 54, 64, 65, 76, 98,34};

mySort(a,0,10);

for(int i = 0;i<11;i++){

 printf("%d\n",a[i]);

}

return 0;

}

目录
相关文章
|
6天前
|
机器学习/深度学习 数据采集 存储
一文读懂蒙特卡洛算法:从概率模拟到机器学习模型优化的全方位解析
蒙特卡洛方法起源于1945年科学家斯坦尼斯劳·乌拉姆对纸牌游戏中概率问题的思考,与约翰·冯·诺依曼共同奠定了该方法的理论基础。该方法通过模拟大量随机场景来近似复杂问题的解,因命名灵感源自蒙特卡洛赌场。如今,蒙特卡洛方法广泛应用于机器学习领域,尤其在超参数调优、贝叶斯滤波等方面表现出色。通过随机采样超参数空间,蒙特卡洛方法能够高效地找到优质组合,适用于处理高维度、非线性问题。本文通过实例展示了蒙特卡洛方法在估算圆周率π和优化机器学习模型中的应用,并对比了其与网格搜索方法的性能。
68 1
|
1月前
|
机器学习/深度学习 自然语言处理 算法
【数据挖掘】2020奇安信秋招算法方向试卷1 笔试题解析
2020年奇安信秋招算法方向试卷1的题目解析,覆盖了数据结构、机器学习、深度学习、自然语言处理、排序算法、激活函数、主题模型、采样方法、图像处理等多个领域的知识点。
35 1
【数据挖掘】2020奇安信秋招算法方向试卷1 笔试题解析
|
14天前
|
算法 JavaScript 前端开发
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
75 1
|
14天前
|
缓存 算法 前端开发
深入理解缓存淘汰策略:LRU和LFU算法的解析与应用
【8月更文挑战第25天】在计算机科学领域,高效管理资源对于提升系统性能至关重要。内存缓存作为一种加速数据读取的有效方法,其管理策略直接影响整体性能。本文重点介绍两种常用的缓存淘汰算法:LRU(最近最少使用)和LFU(最不经常使用)。LRU算法依据数据最近是否被访问来进行淘汰决策;而LFU算法则根据数据的访问频率做出判断。这两种算法各有特点,适用于不同的应用场景。通过深入分析这两种算法的原理、实现方式及适用场景,本文旨在帮助开发者更好地理解缓存管理机制,从而在实际应用中作出更合理的选择,有效提升系统性能和用户体验。
41 1
|
22天前
|
机器学习/深度学习 算法 TensorFlow
【深度学习】深度学习语音识别算法的详细解析
深度学习语音识别算法是一种基于人工神经网络的语音识别技术,其核心在于利用深度神经网络(Deep Neural Network,DNN)自动从语音信号中学习有意义的特征,并生成高效的语音识别模型。以下是对深度学习语音识别算法的详细解析
43 5
|
19天前
|
JavaScript 算法 前端开发
"揭秘Vue.js的高效渲染秘诀:深度解析Diff算法如何让前端开发快人一步"
【8月更文挑战第20天】Vue.js是一款备受欢迎的前端框架,以其声明式的响应式数据绑定和组件化开发著称。在Vue中,Diff算法是核心之一,它高效计算虚拟DOM更新时所需的最小实际DOM变更,确保界面快速准确更新。算法通过比较新旧虚拟DOM树的同层级节点,递归检查子节点,并利用`key`属性优化列表更新。虽然存在局限性,如难以处理跨层级节点移动,但Diff算法仍是Vue高效更新机制的关键,帮助开发者构建高性能Web应用。
33 1
|
21天前
|
机器学习/深度学习 自然语言处理 负载均衡
揭秘混合专家(MoE)模型的神秘面纱:算法、系统和应用三大视角全面解析,带你领略深度学习领域的前沿技术!
【8月更文挑战第19天】在深度学习领域,混合专家(Mixture of Experts, MoE)模型通过整合多个小型专家网络的输出以实现高性能。从算法视角,MoE利用门控网络分配输入至专家网络,并通过组合机制集成输出。系统视角下,MoE需考虑并行化、通信开销及负载均衡等优化策略。在应用层面,MoE已成功应用于Google的BERT模型、Facebook的推荐系统及Microsoft的语音识别系统等多个场景。这是一种强有力的工具,能够解决复杂问题并提升效率。
35 2
|
27天前
|
算法 JavaScript 前端开发
对称加密算法解析:DES、AES及其在`pycryptodome` 和 `crypto-js` 模块中的应用
对称加密算法解析:DES、AES及其在`pycryptodome` 和 `crypto-js` 模块中的应用
78 1
|
1月前
|
机器学习/深度学习 运维 算法
深入探索机器学习中的支持向量机(SVM)算法:原理、应用与Python代码示例全面解析
【8月更文挑战第6天】在机器学习领域,支持向量机(SVM)犹如璀璨明珠。它是一种强大的监督学习算法,在分类、回归及异常检测中表现出色。SVM通过在高维空间寻找最大间隔超平面来分隔不同类别的数据,提升模型泛化能力。为处理非线性问题,引入了核函数将数据映射到高维空间。SVM在文本分类、图像识别等多个领域有广泛应用,展现出高度灵活性和适应性。
76 2
|
23天前
|
存储 缓存 算法
深入解析B树:数据结构、存储结构与算法优势
深入解析B树:数据结构、存储结构与算法优势

热门文章

最新文章

推荐镜像

更多