Java实现各种内部排序算法

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

array[j+1] = temp;

flag = true; //有元素交换,则该序列初始状况不是有序的

}

}

if(flag == false){ //本趟遍历后没有发生交换,说明表已经有序

return array;

}

}

return array;

}

快速排序:

思想:基于分治的思想:在待排序表中任取一个元素pivot作为基准,通过一趟排序将待排序表划分为独立的两部分,使得一部分中所有元素小于等于pivot,另一部分中所有元素大于pivot,则pivot放在了其最终位置上,这个过程称为一趟快速排序。而后递归地对两个子表重复上述过程,直到每部分内只有一个元素或空为止。

性能: 空间复杂度:需要递归工作栈:最坏o(n),平均o(logn)

时间复杂度:最坏:o(n^2)初始表基本有序或基本逆序,平均o(n*logn)

不稳定

public int[] quickSort(int[] array,int low,int high){

if(low<high){ //递归跳出的条件

int mid= partition(array, low, high); //划分,得到枢值所在的下表

quickSort(array,low,mid-1); //依次对两个子表进行递归排序

quickSort(array,mid+1,high);

}

return array;

}

//快速排序的划分函数

public int partition(int[] array,int low, int high){

int pivot = array[low]; //每次取数组中的第一个元素为基准

while(low < high){ //跳出循环的条件

while(low<high && array[high] > pivot){ //从右边开始找到第一个小于或等于pivot的值

high–;

}

while(low<high && array[low] < pivot){ //从左边开始找到第一个大于或等于pivot的值

low++;

}

int temp = array[low]; //交换

array[low] = array[high];

array[high] = temp;

if(low<high && array[low] == pivot && array[high] == pivot){ //特殊情况

low++;

}

}

return low;

}

简单选择排序:

思想:假设排序表array[0,…,n-1],第 i 趟排序即从array[0,…,n-1]中选择关键字最小的元素与array[i]交换,每一趟排序可以确定一个元素的最终位置,这样经过n-1趟派克就可以使整个序列有序。

性能:时间复杂度:o(n^2),空间复杂度o(1),不稳定

public int[] simpleSelectSort(int[] array){

for(int i=0;i<array.length -1;i++){ //一共进行n-1趟

int min = i; //记录最小元素位置

for(int j=i+1;j<array.length;j++){ //在array[i,…,n-1]中选择最小的元素

if(array[j] < array[min]){

min = j; //更新最小元素的位置

}

}

int temp = array[i]; //将最小元素与第i个位置交换

array[i] = array[min];

array[min] = temp;

}

return array;

}

堆排序:Java实现堆排序(大根堆)

归并排序:

思想:“归并”的含义是将两个或两个以上的有序表组合成一个新的有序表。假设待排序表含有n个记录,则可以看成是n个有序的子表,每个子表的长度为1,然后两两归并,得到(n/2)个长度为2或1的有序表;再两两归并,…,如此重复,直到合并成一个长度为n的有序表为止,这种排序方法称为2-路归并排序。

递归形式的2-路归并排序算法是基于分治的,其过程如下:

分解:将含有n个元素的待排序表分成各含有n/2个元素的子表,采用2-路归并排序算法对两个子表递归地进行排序;

合并:合并两个已排序的子表得到排序结果。

性能:空间复杂度:o(n);时间复杂度:o(nlogn);稳定

public int[] mergeSort(int[] array,int low, int high){

if(low < high){ //递归结束的条件

int mid = (low + high)/2; //二路归并排序,从中间划分两个子序列【分解过程】

mergeSort(array, low, mid); //对左侧子序列进行递归排序

mergeSort(array, mid+1, high); //对右侧子序列进行递归排序

merge(array,low,mid,high); //归并【合并过程】

}

return array;

}

//将前后相邻的两个有序表归并为一个有序表

private void merge(int[] array,int low, int mid, int high){

int[] tempArray = new int[array.length]; //辅助数组tempArray

for(int i=low;i<=high;i++){ //将array数组中[low…high]的元素复制到辅助数组tempArray中

tempArray[i] = array[i];

}

int i,j,k;

for(i=low,j=mid+1,k=i;i<=mid && j<=high;k++){

if(tempArray[i]>tempArray[j]){ //比较tempArray的左右两端中的元素

array[k] = tempArray[j++]; //将较小值复制到array中

}else{

array[k] = tempArray[i++];

}

}

while(i<=mid){ //若第一个表未检测完,复制

array[k++] = tempArray[i++];

}

while(j<=high){ //若第二个表未检测完,复制

array[k++] = tempArray[j++];

}

}

按 Ctrl+C 复制代码

基数排序:

基于计数排序实现: Java实现基于桶式排序思想和计数排序思想实现的基数排序

基于队列辅助实现:

思想:基数排序不是基于比较进行排序的,而是采用多关键字排序思想,借助“分配”和“收集”两种操作对单逻辑关键字进行排序。

基数排序是利用多关键字先达到局部有序,再调整达到全局有序。

性能:空间复杂度:o®;时间复杂度:o(d(n+r));稳定

其中,r为基数,d为最大关键字的位数(决定了排序的趟数),n为待排序列表中元素的个数。

//基于队列辅助实现的基数排序

public int[] radixSort(int[] array){

//找到待排序序列中的最大元素

int max = array[0];

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

if(array[i] > max){

max = array[i];

}

}

//确定最大元素的位数maxBits

int maxBits = 0;

while(max > 0){

max = max/10;

maxBits ++;

}

//建立10个队列

Queue[] queue = new LinkedList[10];

for(int i=0; i<queue.length; i++){

queue[i] = new LinkedList();

}

//进行maxBits次分配和收集

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

//分配数组

for(int j=0; j<array.length;j++){

//得到元素的第maxBits位,然后将该元素插入到对应的位置

queue[(array[j] % (int)Math.pow(10, i+1))/(int)Math.pow(10, i)].add(array[j]);

}

//元素计数器

int count = 0;

//收集队列元素

for(int k=0;k<queue.length;k++){

while(queue[k].size() > 0){

array[count++] = queue[k].poll().intValue();

}

}

}

return array;

}

计数排序:

前提:待排序表中的所有待排序关键字必须互不相同;

思想:计数排序算法针对表中的每个记录,扫描待排序的表一趟,统计表中有多少个记录的关键码比该记录的关键码小,假设针对某一个记录,统计出的计数值为c,则该记录在新的有序表中的存放位置即为c。

性能:空间复杂度:o(n);时间复杂度:o(n^2);

Spring全套教学资料

Spring是Java程序员的《葵花宝典》,其中提供的各种大招,能简化我们的开发,大大提升开发效率!目前99%的公司使用了Spring,大家可以去各大招聘网站看一下,Spring算是必备技能,所以一定要掌握。

目录:

部分内容:

Spring源码

  • 第一部分 Spring 概述
  • 第二部分 核心思想
  • 第三部分 手写实现 IoC 和 AOP(自定义Spring框架)
  • 第四部分 Spring IOC 高级应用
    基础特性
    高级特性
  • 第五部分 Spring IOC源码深度剖析
    设计优雅
    设计模式
    注意:原则、方法和技巧
  • 第六部分 Spring AOP 应用
    声明事务控制
  • 第七部分 Spring AOP源码深度剖析
    必要的笔记、必要的图、通俗易懂的语言化解知识难点

脚手框架:SpringBoot技术

它的目标是简化Spring应用和服务的创建、开发与部署,简化了配置文件,使用嵌入式web服务器,含有诸多开箱即用的微服务功能,可以和spring cloud联合部署。

Spring Boot的核心思想是约定大于配置,应用只需要很少的配置即可,简化了应用开发模式。

  • SpringBoot入门
  • 配置文件
  • 日志
  • Web开发
  • Docker
  • SpringBoot与数据访问
  • 启动配置原理
  • 自定义starter

微服务架构:Spring Cloud Alibaba

同 Spring Cloud 一样,Spring Cloud Alibaba 也是一套微服务解决方案,包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。

  • 微服务架构介绍
  • Spring Cloud Alibaba介绍
  • 微服务环境搭建
  • 服务治理
  • 服务容错
  • 服务网关
  • 链路追踪
  • ZipKin集成及数据持久化
  • 消息驱动
  • 短信服务
  • Nacos Confifig—服务配置
  • Seata—分布式事务
  • Dubbo—rpc通信

Spring MVC

目录:

部分内容:

服务容错

  • 服务网关
  • 链路追踪
  • ZipKin集成及数据持久化
  • 消息驱动
  • 短信服务
  • Nacos Confifig—服务配置
  • Seata—分布式事务
  • Dubbo—rpc通信

[外链图片转存中…(img-Duy4fi73-1714359323604)]

[外链图片转存中…(img-bQlptg5J-1714359323604)]

Spring MVC

目录:

[外链图片转存中…(img-eAQcODfP-1714359323604)]

[外链图片转存中…(img-daXiVkwA-1714359323605)]

[外链图片转存中…(img-s05FFALO-1714359323605)]

部分内容:

[外链图片转存中…(img-plL1qID3-1714359323605)]

[外链图片转存中…(img-2TK14dzE-1714359323605)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值