经典排序算法解析(二)

简介: 经典排序算法解析

三、希尔排序


   希尔排序也是插入排序的一种,它先将整个数列分割成若干个小的子序列进行插入排序,逐渐减少子序列的个数,直到最后组合成一个数列,完成整个排序过程。希尔排序的过程使用文字描述可以表示为如下几步:


1.假设数列元素个数为n,先取一个小于n的增量d1,将所有间隔d1距离的元素放为1组进行插入排序,d1通常取值n/2,向下取整。


2.再次取d2<d1,将所有间隔d2距离的元素放为1组进行插入排序,通常d2取值为d1/2,向下取整。


3.重复步骤2,直到取得d等于1。


图示希尔排序如下:


image.png


JavaScript实现的希尔排序:


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

//希尔排序

//步长 分组数

var d = Math.floor(array.length/2);

while(d>=1){

//每组元素个数

var counts = Math.floor(array.length/d);

//每组排序依次

for (var i = 0; i < d ; i++) {

 //组内的插入排序

 for(var j = 0;j<counts-1;j++){

  var temp = array[(j+1)*d];

  for(var k = ((j+1)*d);k>0;k-=d){

   if (temp<array[k]) {

    array[k+d] = array[k];

    array[k] = temp;

   }

  }

 }

}

//重取d值

d=Math.floor(d/2);

}

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

C实现的希尔排序:


#include <stdio.h>

//希尔排序

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

int d = size/2;

while(d>=1){

//每组元素个数

int counts = size/d;

//每组排序依次

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

 //组内的插入排序

 for(int j = 0;j<counts-1;j++){

  int temp = array[(j+1)*d];

  for(int k = ((j+1)*d);k>0;k-=d){

   if (temp<array[k]) {

    array[k+d] = array[k];

    array[k] = temp;

   }

  }

 }

}

//重取d值

d=d/2;

}

}

int main(){

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

mySort(a,10);

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

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

}

return 0;

}

四、选择排序


       前边所说的3种排序算法原理上都是插入排序,即从无序数列中逐个取元素将其插入到有序数列中的合适位置。选择排序则刚好与之相反,其从无序数列中先找到最小值,放在排序数列首部,在依次找到剩余数列的中最小值追加入有序数列,最终完成数列的排序。用文字描述选择排序步骤不如:


1.找到数列中的最小值,将其作为有序数列的第一个元素。


2.从剩余数列中找到最小值,追加入有序数列。


3.重复步骤2,直到排完整个数列。


图示描述选择排序如下:

image.png



JavaScript实现的选择排序算法:


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

//选择排序

for(var i=0;i<array.length-1;i++){

//找到最小值

var min = array[i];

var index = i;

for (var j = i+1; j <array.length; j++) {

 if (array[j]<min) {

  min = array[j];

  index = j;

 }

}

//进行交换

array[index]=array[i];

array[i]=min;

}

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

C实现的选择排序算法:


//选择排序

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

for(int i=0;i<size-1;i++){

 int min = array[i];

 int index = i;

 for(int j=i+1;j<size;j++){

  if(array[j]<min){

   min = array[j];

   index = j;

  }

 }

 array[index] = array[i];

 array[i]=min;

}

}

int main(){

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

mySort(a,11);

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

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

}

return 0;

}

五、冒泡排序


     冒泡排序和选择排序是我们学习编程课时必不可少的两种排序算法,冒泡排序算法的核心是每次比较相邻的连个元素,如果它们的顺序不对,则进行交换,一轮排序下来,最大值一定被排序到数列的末端。之后除去最后一个元素再进行第二轮冒泡,直到整个数列排序完成。用文字描述冒泡排序的过程如下:


1.从左向右依次比较相邻两元素,如果顺序不对,则进行交换,最终最大的元素被放在最后。


2.除去最后一个元素,重复步骤1,最终剩下元素中最大的被放在倒数第2个位置。


3.继续上面的重复,直到排完整个数列。


image.png


JavaScript实现的冒泡排序算法:


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

//冒泡排序

for(var i=0;i<array.length-1;i++){

for(var j=0;j<array.length-i-1;j++){

 var temp = array[j];

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

  array[j] = array[j+1];

  array[j+1] = temp;

 }

}

}

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

C实现的冒泡排序算法:


#include <stdio.h>

//冒泡排序

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

for(int i =0;i<size-1;i++){

 for(int j=0;j<size-1-i;j++){

  int temp = array[j];

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

   array[j] = array[j+1];

   array[j+1] = temp;

  }

 }

}

}

int main(){

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

mySort(a,10);

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

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

}

return 0;

}

目录
相关文章
|
5天前
|
存储 机器学习/深度学习 算法
|
6天前
|
机器学习/深度学习 数据采集 人工智能
【热门话题】AI作画算法原理解析
本文解析了AI作画算法的原理,介绍了基于机器学习和深度学习的CNNs及GANs在艺术创作中的应用。从数据预处理到模型训练、优化,再到风格迁移、图像合成等实际应用,阐述了AI如何生成艺术作品。同时,文章指出未来发展中面临的版权、伦理等问题,强调理解这些算法对于探索艺术新境地的重要性。
19 3
|
8天前
|
存储 算法 安全
|
10天前
|
存储 算法 程序员
C++从入门到精通:2.2.1标准库与STL容器算法深度解析
C++从入门到精通:2.2.1标准库与STL容器算法深度解析
|
11天前
|
机器学习/深度学习 存储 人工智能
数据结构与算法设计:深度解析与实践
数据结构与算法设计:深度解析与实践
16 0
|
16天前
|
机器学习/深度学习 数据采集 自然语言处理
【热门话题】常见分类算法解析
本文介绍了6种常见分类算法:逻辑回归、朴素贝叶斯、决策树、支持向量机、K近邻和神经网络。逻辑回归适用于线性问题,朴素贝叶斯在高维稀疏数据中有效,决策树适合规则性任务,SVM擅长小样本非线性问题,KNN对大规模数据效率低,神经网络能处理复杂任务。选择算法时需考虑数据特性、任务需求和计算资源。
22 0
|
26天前
|
机器学习/深度学习 自然语言处理 算法
探索机器学习的奥秘:从基础概念到算法解析
探索机器学习的奥秘:从基础概念到算法解析
40 0
|
26天前
|
存储 算法
从动态规划到贪心算法:最长递增子序列问题的方法全解析
从动态规划到贪心算法:最长递增子序列问题的方法全解析
19 1
|
26天前
|
存储 缓存 算法
深度解析JVM世界:垃圾判断和垃圾回收算法
深度解析JVM世界:垃圾判断和垃圾回收算法
|
27天前
|
搜索推荐 算法 索引
【排序算法】深入解析快速排序(霍尔法&&三指针法&&挖坑法&&优化随机选key&&中位数法&&小区间法&&非递归版本)
【排序算法】深入解析快速排序(霍尔法&&三指针法&&挖坑法&&优化随机选key&&中位数法&&小区间法&&非递归版本)

推荐镜像

更多