Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >只知道冒泡排序?来看看这些排序算法

只知道冒泡排序?来看看这些排序算法

作者头像
Lvshen
发布于 2022-05-05 08:20:30
发布于 2022-05-05 08:20:30
16500
代码可运行
举报
运行总次数:0
代码可运行

那些年我们面试时经常会被问到排序算法,还有被要求现场手写排序算法。这篇文章我们来介绍下程序员遇到过的排序算法。

插入排序

  1. 从第一个元素开始,该元素可以认为已经被排序;
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描;
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置;
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
  5. 将新元素插入到该位置后;
  6. 重复步骤2~5。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static int[] insertionSort(int[] array) {
   if (array.length == 0) {
      return array;
   }
   int current;
   for (int i = 0; i < array.length - 1; i++) {
      current = array[i + 1];
      int preIndex = i;
      while (preIndex >= 0 && current < array[preIndex]) {
         array[preIndex + 1] = array[preIndex];
         preIndex--;
      }
      array[preIndex + 1] = current;
   }
   return array;
}

冒泡排序

  1. 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
  3. 针对所有的元素重复以上的步骤,除了最后一个;
  4. 重复步骤1~3,直到排序完成。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static int[] bubbleSort(int[] array) {
   if (array.length == 0) {
      return array;
   }
   for (int i = 0; i < array.length; i++) {
      for (int j = 0; j < array.length - 1 - i; j++) {
         if (array[j + 1] < array[j]) {
            int temp = array[j + 1];
            array[j + 1] = array[j];
            array[j] = temp;
         }
      }
   }
   return array;
}

选择排序(性能最稳定的排序算法之一)

  • 初始状态:无序区为R[1..n],有序区为空;
  • 第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中-选出关键字最小的记录 R[k],
  • 将它与无序区的第1个记录R交换,使R[1..i]和R[i+1..n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;
  • n-1趟结束,数组有序化了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static int[] selectionSort(int[] array) {
   if (array.length == 0) {
      return array;
   }
   for (int i = 0; i < array.length; i++) {
      int minIndex = i;
      for (int j = i; j < array.length; j++) {
         // 找到最小的数
         if (array[j] < array[minIndex]) {
            // 将最小数的索引保存
            minIndex = j;
         }
      }
      int temp = array[minIndex];
      array[minIndex] = array[i];
      array[i] = temp;
   }
   return array;
}

希尔排序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

public static int[] shellSort(int[] array) {
   int len = array.length;
   int temp, gap = len / 2;
   while (gap > 0) {
      for (int i = gap; i < len; i++) {
         temp = array[i];
         int preIndex = i - gap;
         while (preIndex >= 0 && array[preIndex] > temp) {
            array[preIndex + gap] = array[preIndex];
            preIndex -= gap;
         }
         array[preIndex + gap] = temp;
      }
      gap /= 2;
   }
   return array;
}

归并排序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制


public static int[] mergeSort(int[] array) {
   if (array.length < 2) {
      return array;
   }
   int mid = array.length / 2;
   int[] left = Arrays.copyOfRange(array, 0, mid);
   int[] right = Arrays.copyOfRange(array, mid, array.length);
   return merge(mergeSort(left), mergeSort(right));
}

快速排序方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制


public static int[] quickSort(int[] array, int start, int end) {
   if (array.length < 1 || start < 0 || end >= array.length || start > end) {
      return null;
   }
   int smallIndex = partition(array, start, end);
   if (smallIndex > start) {
      quickSort(array, start, smallIndex - 1);
   }
   if (smallIndex < end) {
      quickSort(array, smallIndex + 1, end);
   }
   return array;
}

private static int partition(int[] array, int start, int end) {
  int pivot = (int) (start + Math.random() * (end - start + 1));
  int smallIndex = start - 1;
  swap(array, pivot, end);
  for (int i = start; i <= end; i++) {
   if (array[i] <= array[end]) {
    smallIndex++;
    if (i > smallIndex) {
     swap(array, i, smallIndex);
    }
   }
  }
  return smallIndex;
}


private static void swap(int[] array, int i, int j) {
  int temp = array[i];
  array[i] = array[j];
  array[j] = temp;
}

桶排序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class BucketSort {

   @Test
    public void test1(){
        int[] t = {5 ,3 ,5 ,2 ,8};
        bucketSort(t);
    }

   private void bucketSort(int[] t) {
      int a[] = new int[11];
      for (int i = 0; i < a.length; i++) {
         a[i] = 0;
      }

      for (int i = 0; i < t.length; i++) {
         int index = t[i];
         if (a[index] != 0) {
            a[index]++;
         } else {
            a[index] = 1;
         }
      }

      for (int i = 0; i < a.length; i++) {
         if (a[i] == 0) {
            continue;
         }
         for (int j = 0; j < a[i]; j++) {
            System.out.println(i);
         }
      }

   }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Lvshen的技术小屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
人生苦短,我用k8s--------------单节点二进制部署
etcd是CoreOS团队于2013年6月发起的开源项目,基于go语言开发,目标是构建一个高可用的分布式键值(key-value)数据库。etcd内部采用raft协议作为一致性算法。
不吃小白菜
2020/10/09
8520
K8S学习笔记之二进制的方式创建一个Kubernetes集群
Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用。不能用于生产环境。
Jetpropelledsnake21
2019/03/20
1.3K0
K8S学习笔记之二进制的方式创建一个Kubernetes集群
二进制方式部署k8s集群
这次部署是使用的二进制方式进行安装,部署的版本是v1.13.1,使用了三台机器做的k8s集群,没有对master做成集群,表如下:
dogfei
2020/07/31
1.9K0
kubernetes(七) 二进制部署k8s(1.18.4版本)
Etcd 是一个分布式键值存储系统,Kubernetes使用Etcd进行数据存储,所以先准备一个Etcd数据库, 为解决Etcd单点故障,应采用集群方式部署,这里使用3台组建集群,可容忍1台机器故障,当然,你也 可以使用5台组建集群,可容忍2台机器故障。
alexhuiwang
2020/09/23
8720
kubernetes(七) 二进制部署k8s(1.18.4版本)
使用二进制包在生产环境部署 Kubernetes v1.13.2 集群
由于众所周知的原因,在国内无法直接访问Google的服务。二进制包由于其下载方便、灵活定制而深受广大kubernetes使用者喜爱,成为企业部署生产环境比较流行的方式之一,Kubernetes v1.13.2是目前的最新版本。安装部署过程可能比较复杂、繁琐,因此在安装过程中尽可能将操作步骤脚本话。文中涉及到的脚本已经通过本人测试。
耕耘实录
2019/07/04
8640
Kubernetes V1.15 二进制部署集群
以下操作均在/data/ssl_config/etcd/目录中 etcd证书ca配置
惨绿少年
2019/09/24
2K2
Kubernetes V1.15 二进制部署集群
深入玩转K8S之手动部署KubernetesV1.11版本及常见问题解答
最开始通过Kubeadm静默黑盒(自动)来安装,为什么这么说呢因为我们是通过Kubeadm自动安装的,并不知道做了那些具体的操作。这也是为什么写这篇手动部署的原因,是为了让大家更好的了解下和体验下两者区别以及部署流程
DevinGeng
2019/04/09
8330
深入玩转K8S之手动部署KubernetesV1.11版本及常见问题解答
Kubernetes v1.12/v1.13 二进制部署集群(HTTPS+RBAC)
Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用。不能用于生产环境。
星哥玩云
2022/07/28
5170
Kubernetes v1.12/v1.13 二进制部署集群(HTTPS+RBAC)
Kubernetes 二进制部署(二)集群部署(多 Master 节点通过 Nginx 负载均衡)
0. 前言 紧接上一篇,本篇文章我们尝试学习多节点部署 kubernetes 集群 并通过 haproxy+keepalived 实现 Master 节点的负载均衡 1. 实验环境 实验环境主要为 5 台虚拟机,IP 地址分别为:192.168.1.65、192.168.1.66、192.168.1.67、192.168.1.68、192.168.1.69 1.1 节点分配 LB 节点: lb1:192.168.1.65 lb2:192.168.1.66 Master 节点: master1:192.
西凉风雷
2022/11/23
1.6K0
Kubernetes 二进制部署(二)集群部署(多 Master 节点通过 Nginx 负载均衡)
Kubernetes-V1.14.2 二进制编译安装部署(node节点篇)
3.6.3 创建 kubelet bootstrapping kubeconfig 文件
运维搬砖
2019/07/24
1.5K2
Kubernetes-V1.14.2 二进制编译安装部署(node节点篇)
Kubernetes 二进制部署(一)单节点部署(Master 与 Node 同一机器)
0. 前言 最近受“新冠肺炎”疫情影响,在家等着,入职暂时延后,在家里办公和学习 尝试通过源码编译二进制的方式在单一节点(Master 与 Node 部署在同一个机器上)上部署一个 k8s 环境,整理相关步骤和脚本如下 参考原文:Kubernetes二进制部署(一)单节点部署 1. 相关概念 1.1 基本架构 1.2 核心组件  1.2.1 Master 1.2.1.1 kube-apiserver 集群的统一入口,各组件协调者 以RESTful API提供接口服务 所有对象资源的增删改查和监听操作都
西凉风雷
2022/11/23
1.4K0
Kubernetes 二进制部署(一)单节点部署(Master 与 Node 同一机器)
Kubernetes 二进制部署(三)集群部署(多 Master 节点通过 Nginx 负载均衡)
0. 前言 上一篇中,我们介绍了多节点部署 kubernetes 集群,并通过 haproxy+keepalived 实现 Master 节点的负载均衡 其中 haproxy+keepalived 以 tcp 模式实现了正向代理和负载均衡 其实 haproxy 可以采用 http 模式工作,并通过 option redispatch 配置实现后端某个真实服务器挂掉后重新转发请求 但是如果我们希望实现在特定 http 状态码出现时,重试请求 因此本篇文章我们采用 nginx 作为负载均衡组件 1. 实验环境
西凉风雷
2022/11/23
1.2K0
03 . 二进制部署kubernetes1.18.4
简介 目前生产部署kubernetes集群主要两种方式 kubeadm Kubeadm是一个K8s部署工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。 二进制包 从github下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群。 Kubeadm降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,推荐使用二进制包部署Kubernetes集群,虽然手动部署麻烦点,期间可以学习很多工作原理,也利于后期维护。 二进制
iginkgo18
2020/09/27
5360
03 . 二进制部署kubernetes1.18.4
Kubernetes v1.18.2 二进制高可用部署
二进制包下载地址:https://github.com/etcd-io/etcd/releases/download/v3.4.7/etcd-v3.4.7-linux-amd64.tar.gz
YP小站
2020/06/04
1.7K0
Kubernetes v1.18.2 二进制高可用部署
二进制搭建Kubernetes集群(最新v1.16.0版本)
下载地址:https://github.com/coreos/etcd/releases
仙人技术
2020/04/29
2K0
二进制搭建Kubernetes集群(最新v1.16.0版本)
k8s二进制集群安装-二进制安装
可以在http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/ 找到各版本kernel安装包
堕落飞鸟
2022/02/25
1.9K2
搭建k8s高可用集群 - 二进制方式
这五台机器均需事先安装好Docker,由于安装过程比较简单这里不进行介绍,可以参考官方文档:
端碗吹水
2020/09/23
2K1
搭建k8s高可用集群 - 二进制方式
kubernetes 二进制安装部署手册
<img src="https://zhangshoufu-images.oss-cn-hangzhou.aliyuncs.com/imagesimage-20200806112601173.png" alt="image-20200806112601173" style="zoom:50%;" />
张琳兮
2020/09/17
3.6K6
kubernetes 二进制安装部署手册
K8S集群安装
主要参考 https://github.com/opsnull/follow-me-install-kubernetes-cluster
JadePeng
2018/12/12
4.2K0
二进制安装k8s v1.25.4 IPv4/IPv6双栈
https://github.com/cby-chen/Kubernetes 开源不易,帮忙点个star,谢谢了
小陈运维
2022/12/20
9340
推荐阅读
相关推荐
人生苦短,我用k8s--------------单节点二进制部署
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文