【算法设计与分析基础】5、冒泡排序与选择排序

package cn.xf.algorithm.ch03;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 数据排序
 *
 * @author xiaof
 *
 */
public class Sort {

	/**
	 * 对给定的数组进行排序 选择排序法 每次选择在当前序列之后的最小值,和当前序列数据进行对换
	 *
	 * @param inputData
	 * @return
	 */
	public static List<Long> selectionSort(List inputData) {
		// 遍历数据,设定一个最小值
		int n = inputData.size(); // 队列长度
		int minIndex = 0;
		Long min = 0l;
		// 最后一个数据不用排列
		for (int i = 0; i < n - 1; ++i) {
			// 初始化最小数据的索引位置
			minIndex = i;
			min = (Long) inputData.get(minIndex);
			// 遍历后面数据,比较最小值
			for (int j = i + 1; j < n; ++j) {
				// 判断大小
				Long tempJ = (Long) inputData.get(j);
				if (tempJ < min) {
					min = tempJ;
					// minIndex = j;
					// 交换数据
					Sort.swap(inputData, minIndex, j);
				}
			}
		}
		// 排序结束之后返回数据
		return inputData;
	}

	/**
	 * 交换数组中的i和j的数据
	 *
	 * @param resourceData
	 * @param i
	 * @param j
	 */
	public static void swap(List resourceData, int i, int j) {
		Object tempO = resourceData.get(i);
		resourceData.set(i, resourceData.get(j));
		resourceData.set(j, tempO);
	}

	/**
	 * 冒泡排序
	 *
	 * @param inputData
	 * @return
	 */
	public static List<Long> bubbleSort(List inputData) {
		// 冒泡排序,就是用当前的元素和后面数据进行比较,一层一层冒泡排序
		int n = inputData.size();

		for (int i = 0; i < n; ++i) {
			// 遍历第二层,进行交换比较,一轮循环,都是选出最后一个元素
			// 然后下一次循环比较的数据就会比原来少1,也就是循环n-i-1次循环
			for (int j = 0; j < n - i - 1; ++j) {
				Long tempJ = (Long) inputData.get(j);
				// 获取要比较的下一个数据
				Long tempJ1 = (Long) inputData.get(j + 1);
				// 从小到大排序,当前比后面大,就交换数据
				if (tempJ > tempJ1) {
					Sort.swap(inputData, j, j + 1);
				}
			}
		}

		return inputData;
	}

	public static void main(String[] args) {
		List<Long> data = Arrays.asList(89l, 45l, 68l, 90l, 29l, 34l, 17l);
		// List<Long> resultData = selectionSort(data);
		List<Long> resultData = bubbleSort(data);
		for (Long data1 : resultData) {
			System.out.print(data1 + "\t");
		}
	}

}

  

时间: 2024-10-03 23:04:10

【算法设计与分析基础】5、冒泡排序与选择排序的相关文章

【算法设计与分析基础】13、合并排序

package cn.xf.algorithm.ch04; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.junit.Test; public class MergeSort { public void mSort(List<Integer> data) { if(data.size() <= 1) { return; } //拷贝两边的数据 List copy

算法设计与分析基础(第3版)读书笔记(及几处翻译上的错误~~)

算法设计与分析基础(第3版) p16 in-place翻译为'在位'?'就地'更合适点 p38 amortized应翻译为'均摊','摊销'这个词简直莫名其妙(可能因为翻译是做算法交易导致的?) p64 迭代优于递归(迭代始终是增量式的,而递归就没办法增量了,除非能够dump整个运行时栈) p73 通过算法可视化得到一个更好的非递归算法(人的图像认知直觉思维?) p79 验证一个拓扑是环.星.还是团?(这个地方有点意思,因为我想到了动态的Verify) p87 凸包问题:从数据结构上讲,Set<

#排序算法#【1】概述、冒泡排序、选择排序

排序算法分类: 内部排序(在排序过程中不需要访问外存就可以完成排序) 外部排序 内部排序分类: 交换排序 冒泡排序 快速排序 选择排序 直接选择排序 堆排序 插入排序 直接插入排序 希尔排序 合并排序 外部排序: 常见的是多路归并算法,即将原文件分为多个能够一次装入内存一部分,分别把每一部分调入内存完成排序,然后对已经排序的子文件进行归并排序 冒泡排序法: 冒泡排序法是一种相邻数据交换的排序方法. 冒泡排序法的基本思想是:对待排序记录关键字从后往前(逆序)进行多遍扫描,当发现相邻两个关键字的次序

【算法设计与分析基础】大整数乘法

#include<iostream> #include<string> #include<time.h> #include<stdlib.h> #include<sstream> using namespace std; class BigDecimal{ private: int max(int a,int b){//获取两数中的最大值 return a^((a^b) & -(a<b)); } public: string n;

Java学习 (七)、数组,查找算法,二分查找法,冒泡排序,选择排序,插入排序

一.常用数组查找算法 工作原理:它又称为顺序查找,在一列给定的值中进行搜索,从一端的开始逐一检查每个元素,知道找到所需元素的过程. 例1:查找指定的数在数组中出现的位置,找到返回下标,找不到返回-1 1 import java.util.Scanner; 2 public class LinearSearch{ 3 public static void main(String []argas) 4 { 5 int [] array={10,100,90,65,80,92}; 6 System.o

【算法设计与分析基础】关灯游戏

① R.java  用于存储一些全局变量 package lightoff; public class R { /* public static int lightCondition[][] = { {1,0,0,1,1}, {1,0,0,1,1}, {1,0,0,1,1}, {1,0,0,1,1}, }; */ public static int lightCondition[][] = { {1,1,1,1}, {1,1,1,1}, {1,1,1,1}, {1,1,1,1}, }; //灯面

【算法设计与分析基础】19、字符串匹配算法

package cn.xf.algorithm.ch07inputEnhancement; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.Test; /** * * 功能:字符串匹配算法,(还有一种叫KMP算法的,也是很经典的算法,就是比较复杂) * * 第一步:对于给定的长度为m的模式和在模式文本中用到的字母表,按照上面的描述构造移动表 * 第二步:将模式与文本的开

【算法设计与分析基础】16、高斯消元法

package cn.xf.algorithm.ch06ChangeRule; import java.util.ArrayList; import java.util.List; import org.junit.Test; import cn.xf.util.GenericPair; /** * * 功能:高斯消元法,也就是多元数据矩阵,依次吧每列的其他行数据消去为0,然后求出一个元的解,然后就可以根据这个数据来递推出其他元的解 * @author xiaofeng * @date 2017

【算法设计与分析基础】20、动态规划-硬币搜集问题

题目: 在n*m格木板中放有一些硬币,每格的硬币数目最多为一个.在木板左上方的一个机器人需要搜集尽可能多的硬币并把他们带到右下方的单元格,每一步,机器人可以从当前的位置向右移动一格 或者向下移动一格,当机器人遇到一个有硬币的单元格的时,就会将这枚硬币搜集起来 解题: 硬币收集的时候,我们 从结果状态开始看,当搜集当前硬币的时候,只有两种方式,从上往下搜集,或者从左向右搜集 也就是当前f[i,j] = max{f[i, j - 1], f[i - 1, j]},初始化第一行和第一列,从第二行和列开