`

冒泡算法的小变种

阅读更多
冒泡算法大家都见得多啦,笔试也经常出,但更多的题目可能会加多一些限制条件。下面举2个例子,这方面做得少的朋友可以以此打开一下思维,其实原理都是一样的。如果有其他的例子或者更好的做法,希望可以提出来,和大家一起分享下:)

题目1:从小到大排列下面一堆数字,3,1,6,2,9,0,2,3,9,3,9 ..并且打印他们重复的次数(先不要急着看答案,自己想一下,能想出更好的做法^_^)


参考代码如下:

import java.util.*;

public class Test2 {
      public static void main(String[] args) {
		int[] values = {3,1,6,2,9,0,2,3,9,3,9};
		sort(values);

	}
      public static void sort(int[] vaa){
    	  
    	  //用于交换
    	  int temp;
    	  //Map是用于存放每个数与他的出现次数(数为key,出现次数是value)
    	  Map<Integer,Integer> m = new HashMap<Integer,Integer>();

    	  int[] arrays = vaa;
    	  for(int i=0;i<arrays.length;i++){
    		  for(int j=0;j<arrays.length-i-1;j++){
    			  
    			  if(arrays[j]>arrays[j+1]){
    				  temp = arrays[j];
    				  arrays[j] = arrays[j+1];
    				  arrays[j+1] = temp;
    			  }    			 
    		  }
    	  }
    	  
    	  for(int i=0;i<arrays.length;i++){
    		  System.out.print(arrays[i]+",");
    	  }
    	  
    	  //计算每个数的重复次数
    	  for(int i = 0;i<arrays.length;i++){
    		  if(!m.containsKey(arrays[i])){
    			  m.put(arrays[i], 1);
    		  }
    		  else{
    			  int a = (Integer)m.get(arrays[i]);
    			  a=a+1;
    			  m.remove(arrays[i]);
    			  m.put(arrays[i], a);
    		  }
    	  }
    	  System.out.println("长度:"+arrays.length);
    	  
    	  //加到Set里面过滤一下重复数字,TreeSet是为了打印出来按顺序好看点
    	  Set<Integer> set = new TreeSet<Integer>();
    	  for(int i=0;i<arrays.length;i++){
    		  set.add(arrays[i]);
    	  }

    	  for(int i:set){
    		  System.out.println(i+",重复次数是:"+(m.get(i)-1));
    	  }
      }    
}




小结:我的做法用Map来记录每个数的重复次数,不一定是最好和最快的。




题目二:从大到小排列下面这些数("5-1-9","5-2-5","5-2-4","5-3-1", "8-1-5"),要求当第一个数相等的时候比较第2个,当第二个相等的时候比较第3个


参考代码如下:

public class StringSort1 {
	public static void main(String[] args) {
		String[] str = {  "5-1-9","5-2-5","5-2-4","5-3-1", "8-1-5" };
		sort(str);
		System.out.println("最后结果为:");
		for(int i=0;i<str.length;i++){
			System.out.println(str[i]);
		}
	}

	public static String[] sort(String[] str) {
		int count=0;
		//冒泡算法:2个for循环
        for(int i=0;i<str.length;i++){
        	for(int j=0;j<str.length-i-1;j++){       		
        	count++;	
        	
        	//解析相邻两个数并比较大小
        	String[] s = str[j].split("-");        	
        	int[] first = new int[3];
        	first[0] = Integer.parseInt(s[0]);
        	first[1] = Integer.parseInt(s[1]);
        	first[2] = Integer.parseInt(s[2]);
        	
        	String[] s2 = str[j+1].split("-");
        	int[] second = new int[3];
        	second[0] = Integer.parseInt(s2[0]);
        	second[1] = Integer.parseInt(s2[1]);
        	second[2] = Integer.parseInt(s2[2]);
        	
        	//比较3种情况进行交换:
        	String temp;
        	if(first[0]<second[0] || (first[0]==second[0] && first[1]<second[1]) ||
        			( first[0]==second[0] && first[1]==second[1] && first[2]<second[2])){
        		temp = str[j];
        		str[j] = str[j+1];
        		str[j+1] = temp;
        	}     	       	
          }
        }		
        System.out.println("遍历了"+count+"次");
		return str;
	}
}



小结:这题更简单,只需要在排列的时候把他们一个一个拿出来,然后比较的时候按3种情况就OK了
希望大家提出更多更好的例子
分享到:
评论

相关推荐

    冒泡排序的两种算法sort和sort1

    冒泡排序是一种基础且历史悠久的排序算法,它通过重复遍历待排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来,直到没有再需要交换的...在学习编程的过程中,掌握冒泡排序及其变种是非常有帮助的。

    冒泡排序及讲解

    冒泡排序的变种还包括:减小冒泡排序,它在每一轮的开始就将已知的最大值移到末尾,从而减少不必要的比较;和双向冒泡排序,它同时从两端向中间进行比较和交换,可能会稍微提高效率。 总之,冒泡排序是一种基础的...

    冒泡排序小知识 很小的

    此外,为了优化冒泡排序,人们提出了几个变种: - **停止标志**:如果在一次遍历中没有发生任何交换,那么可以提前结束排序,因为这意味着数组已经是有序的了。 - **双向冒泡排序**:在排序过程中同时检查从头到尾和...

    Java实现冒泡排序与双向冒泡排序算法的代码示例

    这个算法的名字由来是因为越小的元素会经过交换慢慢“浮”到数列的顶端,就像水中的气泡最终会上浮到水面一样。 在Java中,我们可以创建一个名为`BubbleSort`的类,并在其中定义排序方法。例如,`orderAsc()`是一个...

    冒泡排序练习题1

    本题涉及多个关于冒泡排序及其变种的应用题目。 1. 第一段代码段是冒泡排序的一个简化版本,只进行了两轮排序。初始数组A[1]到A[6]为{52,6,39,47,15,21},在两轮比较后,最大的两个元素会被交换到正确的位置。第一...

    java 冒泡排序法 PPT文档

    - 也可能涉及冒泡排序的变种,如鸡尾酒排序(双向冒泡排序)等。 通过学习这个PPT,你将能够理解冒泡排序的基本思想,掌握其Java实现,以及在不同场景下的应用和优化。如果你是初学者,这个PPT将帮助你打下坚实的...

    冒泡排序 Java代码

    冒泡排序还有几个变种,例如引入一个标志位来判断在某一轮中是否发生过交换,如果没有交换则提前结束排序,这样可以在部分有序的数组中提高效率。此外,还可以使用优化的冒泡排序,如鸡尾酒排序(双向冒泡),在每一...

    排序算法总结(选择,冒泡,插入,归并,快排).pdf

    选择排序、冒泡排序、插入排序、归并排序和快速排序是五种常见的基本排序算法...选择排序和冒泡排序适合在教学和算法理解阶段使用,而在实际应用中,通常会考虑它们的变种或更高级的排序算法,例如堆排序和计数排序等。

    算法-理论基础- 排序- 原始冒泡排序(包含源程序).rar

    此外,也可以考虑采用变种算法如鸡尾酒排序,该算法不仅将元素向上冒泡,还会在数组的另一端进行下沉操作,从而稍微提高排序效率。 ### 结语 虽然冒泡排序在排序算法中并不高效,但它作为排序理论的基石,为我们...

    常用算法设计方法 比较详细的算法

    8. **随机化算法**:如鸽巢原理应用的快速幂运算,以及基于概率的线性时间排序算法——快速选择和快速排序的变种。 9. **数据结构**:与算法紧密相关,如链表、队列、栈、树(二叉树、平衡树如AVL和红黑树)、图...

    华中科技大学中文算法课件

    此章可能会涵盖各种排序算法,如冒泡排序、插入排序、选择排序、快速排序、归并排序等,以及查找算法,如顺序查找、二分查找等。可能还会对比分析它们的时间复杂度和适用场景。 第四章-1:这部分可能是对第四章内容...

    算法导论源码

    1. **排序算法**:如冒泡排序、插入排序、选择排序、快速排序、归并排序、堆排序以及各种变种。这些算法用于将一组数据按照特定顺序排列。 2. **搜索算法**:包括线性搜索、二分查找、哈希表查找等,它们是数据检索...

    排列生成算法 之字典序发与邻位互换法

    邻位互换法,又称为泡沫排序或冒泡排序的变种,是一种生成排列的方法,它不依赖于字典序,而是通过不断交换相邻的元素来达到生成所有排列的目的。这个过程可以理解为从原始顺序(通常是123...n)开始,通过每次交换...

    易语言数组排序算法集合

    冒泡排序是最基础的排序算法之一,通过重复遍历待排序的数组,比较相邻元素并交换顺序,使较大的元素逐渐“冒”到数组的末尾。其主要步骤是:比较相邻元素,如果前一个比后一个大,则交换位置,一轮遍历后最大的...

    算法与数据结构-C语言版

    1. **基础算法**:包括排序(冒泡排序、插入排序、选择排序、快速排序、归并排序、堆排序等)和搜索(线性搜索、二分查找、哈希查找)等,这些是程序设计中的基本操作,理解其原理和效率至关重要。 2. **递归与分治...

    排列组合的全排列算法(交换算法)

    交换算法,也称为冒泡排序的变种,通过不断交换数组中的元素来生成所有可能的排列。其基本思想是使用两个指针,一个指向当前未排序序列的起始位置,另一个指向已排序序列的末尾。在每一轮迭代中,将未排序的第一个...

    50道Java程序算法题

    8. **问题解决策略**:解题过程往往需要逻辑思维和创新,可能需要将复杂问题分解为更小的子问题,或者寻找已知算法的变种来解决问题。 9. **版本控制**:如果解题过程涉及到团队合作,那么使用Git或其他版本控制...

    数据结构与算法-java

    - **排序算法**:如冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等,以及Java内置的Arrays.sort()方法。 - **搜索算法**:线性搜索、二分搜索、深度优先搜索(DFS)、广度优先搜索(BFS)。 - **图...

    五种排序算法

    桶排序算法主要适用于输入数据均匀分布于一个较小范围内的情况。该算法的基本思路是将数据分到有限数量的桶里,每个桶再个别排序(通常使用其他排序算法或以递归方式继续使用桶排序进行排序)。桶排序的时间复杂度...

Global site tag (gtag.js) - Google Analytics