Java冒泡排序与直接选择排序代码随笔

  冒泡排序:延申的有很多种,有的是先确定最大值放到后面,有的是先确定最小值放到前边,还有就是反过来,先确定最小值的位置,但是本质都是:不断两两比较,交换位置。。。第一趟确定一个最大(最小)值放到前边(后边),第二趟,排除选的最值继续排。。。。趟数是外循环控制,交换位置的事交给内循环。
  直接选择排序:这个应该比冒泡排序快,因为它内循环只是确定最大(小)索引值,然后在外循环的内部只有一次交换最值,而冒泡排序只要值不一样,每次都要交换相对最值,下面看代码再理解一下。

  嵌套循环中,一般把外部循环的变量导入到内循环循环条件中,这样,外部循环变量变了,势必会导致内循环循环条件的改变,减少内循环次数。

  因为刚看了一个简单工厂模式,所以就用工厂模式来试着实践一下排序,含冒泡,直接选择还有一个排序反转(其实不应该归到排序接口里),由于刚刚接触工厂模式,代码中,就只是用的int[ ]型数组,没有考虑其他类型数组及正序/反序,正序/反序就是修改内循环里交换条件的大于小于改变。。

package javafirst;

/**
 * 此接口定义排序方法
 *
 */
interface Sort{
	/**
	 * 排序方法
	 * @param arr 需要排序的int型数组
	 * @return 返回一个int型数组
	 */
	public int[] sort(int[] arr);
}
/**
 *实现冒泡排序
 */
class BubbleSort implements Sort{
	public int[] sort(int[] arr){
		//因为外层for循环是控制循环趟数,从1开始比较直观一些
		for(int i = 1; i < arr.length; i ++){
			for(int k = 0; k < arr.length - i; k++){
				if(arr[k] > arr[k+1]){
					int temp = arr[k];
					arr[k] = arr[k+1];
					arr[k+1] = temp;
				}
			}
		}
		return arr;
	}
}
/**
 *实现直接排序
 */
class SelectSort implements Sort{
	public int[] sort(int[] arr){
		for(int i = 1; i < arr.length; i++){
			int index = 0;
			//此内循环的目的是找出最大值的索引
			for(int k = 1; k <= arr.length - i; k++){
				if(arr[k] > arr[index])
					//这里只是交换索引,而不是交换值
					index = k;
			}
			//当上边内循环循环完毕之后,会选出一个最大值,其索引值为index,然后与数组后边值交换位置
			//这里是值得交换
			int temp = arr[arr.length - i];
			arr[arr.length - i] = arr[index];
			arr[index] = temp;
		}
		return arr;
	}
}
/**
 *实现反转排序
 */
class ReverseSort implements Sort{
	public int[] sort(int[] arr){
		//就是交换数组前后的相对位置
		for(int i = 0; i < arr.length / 2; i ++){
			int temp = arr[i];
			arr[i] = arr[arr.length - 1 - i];
			arr[arr.length - 1 - i] = temp;
		}
		return arr;
	}
}
/**
 *排序类实例工厂
 */
class SortFactory{

	/**
	 * 实例化
	 * @param sortName 排序方式
	 * @return 返回一个Sort实例
	 */
	public Sort createSort(String sortName){
		String str = sortName.toLowerCase();
		Sort sor = null;
		switch (str){
		case "bubblesort":
			sor = new BubbleSort();
			break;
		case "selectsort":
			sor = new SelectSort();
			break;
		case "reversesort":
			sor = new ReverseSort();
			break;
		}
		return sor;
	}
}
/**
 *遍历数组类
 */
class Show{
	public void showArray(int[] arr){
		for(int i : arr){
			System.out.print(i + " ");
		}
		System.out.println();
	}
}

public class Test13 {
	public static void main(String[] args){
		Show show = new Show();

		//使用冒泡排序
		int[] arr1 = new int[]{2,4,5,3,6,1,12,14,17,22,15,18,16,12,13,18,10};
		System.out.println("输出原数组:");
		show.showArray(arr1);
		Sort so1 = new SortFactory().createSort("BubbleSort");
		int[] arrBubble = so1.sort(arr1);
		System.out.println("冒泡排序结果:");
		show.showArray(arrBubble);

		//使用直接排序
		int[] arr2 = new int[]{2,4,5,3,6,1,12,14,17,22,15,18,16,12,13,18,10};
		System.out.println("输出原数组:");
		show.showArray(arr2);
		Sort so2 = new SortFactory().createSort("SELECTSORT");
		int[] arrSelect = so2.sort(arr2);
		System.out.println("直接排序结果:");
		show.showArray(arrSelect);

		//反转排序,得使用排序好的数组
		Sort so3 = new SortFactory().createSort("ReverseSORT");
		int[] arrReverse = so3.sort(arr2);
		System.out.println("反转已排好序数组排序结果:");
		show.showArray(arrReverse);
	}

}

  输出结果

时间: 2024-10-12 06:37:32

Java冒泡排序与直接选择排序代码随笔的相关文章

冒泡排序与简单选择排序——Java实现

1.冒泡排序 1)原理说明:重复遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. 2)代码实现: package com.test.sort; public class BubbleSort { public static void sort(int[] data) { for (int i = 0; i < data.length; i++) { for (int j = data.length

&lt;17&gt;【掌握】冒泡排序代码实现+【掌握】选择排序代码实现

#include <stdio.h> void maoPao(int arr[],int len){ int temp; //双重循环 for(int i=0;i<len-1;i++){ //因为i的值每变化一次,跑了一趟,按照冒泡的思想 //有一个数已经下沉了 //没有必要和已经有序的数据进行比较了 //j<len-1-i;所以 j<len-1也可以,但是多跑会 for (int j=0; j<len-1-i; j++) { if (arr[j]>arr[j+1

java基础算法之选择排序

选择排序 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完. 时间复杂度  选择排序的交换操作介于 0 和 (n - 1) 次之间.选择排序的比较操作为 n (n - 1) / 2 次之间.选择排序的赋值操作介于 0 和 3 (n - 1) 次之间.比较次数O(n^2),比较次数与关键字的初始状态无关,总的比较次数N=(n-1)+(n-2)+...+1=n*(

排序(二)__冒泡排序、简单选择排序和直接插入排序

前面<排序(一)__综述>提到按照算法的复杂度分为简单算法和改进算法两大类,本文主要就简单算法中的冒泡排序.简单选择排序和直接插入排序进行通俗详细的解析. 一.冒泡排序 1.基本概念 冒泡排序是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止.(动态图来自维基百科) 2.关键代码(优化之后) void BubbleSort(SqList *L) { int i,j; Status flag=TRUE;            //flag用作标记,避

七大内部排序算法总结(插入排序、希尔排序、冒泡排序、简单选择排序、快速排序、归并排序、堆排序)

 写在前面: 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列.因此排序掌握各种排序算法非常重要.对下面介绍的各个排序,我们假定所有排序的关键字都是整数.对传入函数的参数默认是已经检查好了的.只是简单的描述各个算法并给出了具体实现代码,并未做其他深究探讨. 基础知识: 由于待排序的记录数量不同,使得排序过程中设计的存储器不同,可将排序方法分为两大类:一类是内部排序,指的是待排序记录存放在计算机随机存储器中进行的排序过程.另一类是外部排序,

排序算法学习之简单排序(冒泡排序,简单选择排序,直接插入排序)

一.冒泡排序 冒泡排序算是最基础的一种算法了,复杂度为O(N^2),其基本思想是:从最低端数据开始,两两相邻比较,如果反序则交换.代码如下: /*最基本的冒泡排序*/ void BubbleSort1 (int n, int *array) /*little > big*/ { int i, j; for (i=0; i<n-1; i++) { for (j=n-1; j>i; j--) { if (array[j] < array[j-1]) { int temp = array

直接插入排序、二分插入排序、希尔排序、冒泡排序与简单选择排序

一.直接插入排序 稳定,时间复杂度:最好O(n).最差O(n^2).平均O(n^2),空间复杂度O(1) void InsertSort(int L[], int n) { int i, j,key; for (i = 1; i<n; i++) if(L[i] < L[i-1])//需要将L[i]插入到有序表L[0...i-1] { key = L[i]; for(j = i-1; j >= 0 && key < L[j]; j--)//后移 L[j+1] = L[

冒泡排序Vs直接选择排序

什么是排序?为什么要使用排序?其实我们生活中处处都用到了排序,拿字典来说,现在,我们要在字典中查找某个字(已经知道这个字的读音),首先,我们需要根据这个字的读音,找到它所所在目录中的位置,然后根据这个字的所在页数准确的定位到这个字的位置. 在查找字的过程中,我们注意到了这样的字眼,根据读音找到...位置,根据页数定位这个字的位置,我们在无意识的情况下,使用到了排序和查找,字典的编写者对整部字典进行了排序,我们的工作就是根据字典的排序方法查找某个记录.下面详细的介绍排序的相关内容. 排序是一个处理

冒泡排序、简单选择排序、直接插入排序

冒泡排序(Bubble Sort)的基本思想:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止.时间复杂度为O(n2). 简单选择排序(Simple Selection Sort)的基本思想:通过n-i次关键字之间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录交换.应该说,尽管与冒泡排序同为O(n2), 但简单选择排序的性能上还是要略优于冒泡排序. 直接插入排序(Straight Insertion Sort)的基本思想:将一个记录插入到前面已经排序好的有序表中