Java数组排序总结(冒泡,选择,插入,…

本文深入介绍了四种基本的Java排序算法:冒泡排序、选择排序、插入排序和希尔排序,并提供了详细的代码实现。此外,还探讨了递归算法的复杂度,并通过一个具体的例子解释了动态规划如何提高递归算法的效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java数组排序总结(冒泡,选择,插入,希尔)

public class SortAll   
  
 
  
 
public static void main(String[] args)   
  
int[] 1, 5, 6, 12, 4, 9, 3, 23, 39, 403, 596, 87 };   
  System.out.println("----
冒泡排序的结果:");   
  maoPao(i);   
  System.out.println();   
  System.out.println("----
选择排序的结果:");   
  xuanZe(i);   
  System.out.println();   
  System.out.println("----
插入排序的结果:");   
  chaRu(i);   
  System.out.println();   
  System.out.println("----
希尔(Shell)排序的结果:");   
  shell(i);   
   
  
 
// 冒泡排序   
 public static void maoPao(int[] x)   
  
for (int 0; x.length; i++)   
   
for (int 1; x.length; j++)   
    
if (x[i] x[j])   
     
int temp x[i];   
     x[i] x[j];   
     x[j] temp;   
      
     
    
  
for (int x)   
   System.out.print(i ");   
    
   
  
 
// 选择排序   
 public static void xuanZe(int[] x)   
  
for (int 0; x.length; i++)   
   
int lowerIndex i;   
   
// 找出最小的一个索引   
   for (int 1; x.length; j++)   
    
if (x[j] x[lowerIndex])   
     lowerIndex j;   
      
     
   
// 交换   
   int temp x[i];   
   x[i] x[lowerIndex];   
   x[lowerIndex] temp;   
    
  
for (int x)   
   System.out.print(i ");   
    
   
  
 
// 插入排序   
 public static void chaRu(int[] x)   
  
for (int 1; x.length; i++) {// i从一开始,因为第一个数已经是排好序的啦   
   for (int i; 0; j--)   
    
if (x[j] x[j 1])   
     
int temp x[j];   
     x[j] x[j 1];   
     x[j 1] temp;   
      
     
    
  
for (int x)   
   System.out.print(i ");   
    
   
  
 
// 希尔排序   
 public static void shell(int[] x)   
  
// 分组   
  for (int increment x.length 2; increment 0; increment /= 2)   
   
// 每个组内排序   
   for (int increment; x.length; i++)   
    
int temp x[i];   
    
int 0;   
    
for (j i; >= increment; -= increment)   
     
if (temp x[j increment])   
      x[j] x[j increment];   
     
else   
      
break  
       
      
    x[j] temp;   
     
    
  
  
for (int x)   
   System.out.print(i ");   
    
   
}

 

 

 

 

递归算法的复杂度

                                                   
递归算法的复杂度通常很难衡量,一般都认为是每次递归分支数的递归深度次方。但通常情况下没有这个大,如果我们可以保存每次子递归的结果的话,递归算法的复杂性等于不同的节点个数。这也是动态规划算法思想的由来。

看一下下面这个算法题目,据称是百度的笔试题:

简述:实现一个函数,对一个正整数n,算得到1需要的最少操作次数:

如果n为偶数,将其处以2;如果n为奇数,可以加1或减1;一直处理下去。

要求:实现函数(实现尽可能高效)int func(unsigned int n)n为输入,返回最小的运算次数。
我不确定是不是对n的操作次数有一个简单的刻画,尝试着想了一会儿,似乎不太容易想到。但后来发现这个题目本质上不是算法题,而是算法分析题。因为仔细分析可以发现,题目中给的递归构造本身就是非常高效的。

直接按照题目中的操作描述可以写出函数:

int function(unsigned int n) {
if (n == 1) return 0;
if (n%2 == 0) return 1 + function(n/2);
return 1 + min(function((n + 1)/2), function((n - 1)/2));
}
在递归过程中,每个节点可以引出一条或两条分支,递归深度为,所以总节点数为级别的,但为何还说此递归本身是非常高效的呢?

理解了动态规划的思想,就很容易理解这里面的问题。因为动态规划本质上就是保存运算结果的递归,虽然递归算法经常会有指数级别的搜索节点,但这些节点往往重复率特别高,当保存每次运算的节点结果后,在重复节点的计算时,就可以直接使用已经保存过的结果,这样就大大提高了速度(每次不仅减少一个节点,而且同时消灭了这个节点后面的所有分支节点)。

在这个问题里是什么情况呢?仔细分析就会发现,在整个搜索数中,第层的节点只有两种可能性和。这意味着整个搜索树事实上只有个节点。所以这个递归算法本质上的运算复杂度只有。这已经是最优的了。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值