`

java实现交换排序(冒泡排序、快速排序)

阅读更多

 

冒泡排序

   由于它的简洁,冒泡排序通常被用来对于程序设计入门的学生介绍算法的概念。  

 

冒泡排序算法的运作如下:

 

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
	/**
	 * 冒泡排序
	 * 
	 * @param ts
	 */
	public static <T extends Comparable<? super T>> void BubbleSort(T[] ts) {
		// 如果一次都没有交换,表示已经排好序
		boolean isSorted = false;
		// 从0到i中找出最大值
		for (int i = ts.length - 1; i > 0; i--) {

			isSorted = true;

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

				if (ts[y].compareTo(ts[y + 1]) > 0) {

					isSorted = false;
					T temp = ts[y + 1];
					ts[y + 1] = ts[y];
					ts[y] = temp;

				}

			}

			if (isSorted)
				break;
		}
	}

 

 

1.  时间复杂度:O(n^2)

 

      冒泡排序耗时的操作有:比较 + 交换赋值。时间复杂度如下:

1)    最好情况:序列是升序排列,在这种情况下,需要进行的比较操作为(n-1)次。交换操

        作为0次。即O(n)


2)   最坏情况:序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。交换操作数和比

       较操作数一样。即O(n^2)

 

3)   渐进时间复杂度(平均时间复杂度):O(n^2)

2.   空间复杂度:O(1)


3.  稳定性

         冒泡排序是稳定的,不会改变相同元素的相对顺序。

 

 

快速排序

 

       快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序n个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n)算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来

        基本思想参考:http://ahalei.blog.51cto.com/4767671/1365285

 

       本例中排序思想:补充快排的一些细节。

 

         1)从ts[left]、ts[center]、ts[right]选出中间值作为基准值。

              好处:三个元素中最小者被分在ts[left],而这正是分割阶段应该将它放到的位置。三

                        个元素中最大着被分在ts[right],这也是正确位置,因为它大于基准值。因此我

                        们可以把基准放到a[right-1]。

 

         2)左面开始位置 i ,右面开始位置 j

 

         3)经过第1步,left<基准,right>基准,基准位置在[right-1]  。因此 i = left+1 ,j = right-2

 

         4)快排是用递归来实现的,所以到最后,会经常出现小数组排序的情况,即排序区域只有〈=20个元素。对于小的数组,快排不如插入排序。本例中采用一种好的截止范围是N=10,这种做法刚好避免了在三个元素取中值而实际上却只有一个或两个元素的情况。

 

	/**
	 * 快速排序
	 */
	public static <T extends Comparable<? super T>> void quickSort(T[] ts) {

		quickSort(ts, 0, ts.length - 1);
	}

	/**
	 * 主例程
	 */
	private static <T extends Comparable<? super T>> void quickSort(T[] ts, int left, int right) {

		if (left + 10 <= right) {

			T pivot = median3(ts, left, right);

			int i = left, j = right - 1;

			for (;;) {// 开始i,j交换

				while (ts[++i].compareTo(pivot) < 0) {}// i>=pivot stop
				while (ts[--j].compareTo(pivot) > 0) {}// j<=pivot stop

				if (i < j)
					swapRef(ts, i, j);// i,j交换
				else
					break;

			}

			swapRef(ts, i, right - 1); // 恢复基准值位置

			quickSort(ts, left, i - 1); // 排序小元素
			quickSort(ts, i + 1, right);// 排序大元素

		} 
		else  //排序元素个数小于10,采用直接插入排序
			insertSort(ts, left, right);

	}

	/**
	 * left\right\center 取中值=基准(pivot)
	 */
	private static <T extends Comparable<? super T>> T median3(T[] ts, int left, int right) {

		int center = (left + right) / 2;

		// 两步确定3个值中的最小,放到left位置
		if (ts[center].compareTo(ts[left]) < 0)
			swapRef(ts, center, left);
		if (ts[right].compareTo(ts[left]) < 0)
			swapRef(ts, right, left);
		if (ts[right].compareTo(ts[center]) < 0)
			swapRef(ts, center, right);

		// 基准 位置
		swapRef(ts, center, right - 1);

		return ts[right - 1];
	}

	/**
	 * 交换元素位置
	 */
	private static <T extends Comparable<? super T>> void swapRef(T[] ts, int x, int y) {
		T temp = ts[x];
		ts[x] = ts[y];
		ts[y] = temp;
	}

	/**
	 * 插入排序
	 */
	private static <T extends Comparable<? super T>> void insertSort(T[] ts, int left, int right) {
		int y;
		for (int i = left + 1; i <= right; i++) {
			T temp = ts[i];
			for (y = i; y > left && temp.compareTo(ts[y - 1]) < 0; y--)
				ts[y] = ts[y - 1];
			ts[y] = temp;
		}

	}

1.  时间复杂度:O(n^2)

 

       最差时间复杂:O(n^2)

       最优时间复杂:O(nlogn)

       平均时间复杂:O(nlogn)


2.   空间复杂度:

 

           O(n log n)


3.  稳定性

         不稳定。

 
 

 简单性能测试

 

	/**
	 * 简单的
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		int num = 1000000;
		Integer[] inters = new Integer[num];
		Random inter = new Random();
		for (int i = 0; i < num; i++) {
			inters[i] = inter.nextInt(num);
		}
		long tims = System.currentTimeMillis();
		quickSort(inters);
		tims -= System.currentTimeMillis();
		System.err.println(tims * -1);
		// System.err.println(Arrays.toString(inters));
	}
 

 

 

 

排序方法\数组大小 1000 5000 10000 50000 10w 100w 1000w
直接插入排序 17 50 130 2.4s 10s 太长 太长
二分for循环 8 43 60 950 5s 太长 太长
二分java本地copy 1 10 23 165 470 50s 太长
选择排序 29 45 104 2.3s 10s 太长 太长
冒泡排序 35 106 320 8s 38s 太长 太长
希尔增量排序 2 11 20 38 55 1s 20s
堆排序 3 15 20 28 40 600 10s
快速排序 1 9 19 80(比较不稳定) 130(不稳) 250 3.7s
2
6
分享到:
评论

相关推荐

    java实现冒泡排序

    在实际编程中,Java还提供了其他的排序算法实现,如`Arrays.sort()`方法,它是基于快速排序和插入排序的混合算法,性能优于冒泡排序,适用于大多数情况。然而,理解并实现冒泡排序有助于初学者掌握排序算法的基本...

    用java实现冒泡排序法

    以下是一个简单的Java冒泡排序实现: ```java public class BubbleSort { public static void main(String[] args) { int[] array = new int[]{5, 2, 8, 3, 9, 1}; // 待排序的数组 int n = array.length; ...

    JAVA冒泡排序和快速排序算法

    在JAVA中,实现这两种排序算法可以使用面向对象的特性,创建一个类如`MaopaoKuaisu.java`,在这个类中定义两个方法,分别实现冒泡排序和快速排序。类的结构可能如下: ```java public class MaopaoKuaisu { public...

    java 冒泡排序 数组冒泡排序

    下面我们将深入探讨冒泡排序的工作原理、Java代码实现以及其效率分析。 ### 冒泡排序的工作原理 冒泡排序的基本思想是,重复地走访过要排序的元素列表,依次比较相邻的两个元素,如果它们的顺序(如从小到大)错误...

    交换排序Java实现

    本篇文章将深入探讨在Java中实现两种经典的排序算法:冒泡排序和快速排序。 首先,让我们从冒泡排序开始。冒泡排序是一种简单直观的排序算法,它重复地遍历待排序的数列,一次比较两个元素,如果他们的顺序错误就把...

    java冒泡排序java冒泡排序集锦方法!

    以上三个知识点总结了关于 Java 排序的一些基本应用,包括基础的冒泡排序算法、使用标准库 `Collections.sort()` 进行排序以及使用 `RuleBasedCollator` 实现国际化排序等。这些技术对于编写高效、可维护的 Java ...

    常用排序算法的java实现(冒泡、插入、选择、希尔、归并、快排)

    在Java中,冒泡排序的基本思路是使用两个for循环,外层循环控制比较的轮数,内层循环用于两两比较并交换。改进的冒泡排序通常包括设置标志位来检测是否已经完成排序,以及添加一个提前退出循环的条件,当某次遍历...

    java快速排序、冒泡排序、插入排序示例

    以上就是Java中快速排序、冒泡排序和插入排序的实现方式。快速排序的平均时间复杂度为O(n log n),冒泡排序和插入排序的平均时间复杂度为O(n^2)。在实际应用中,快速排序通常优于其他两种排序,尤其是在大数据量时。...

    java版冒泡排序,插入排序,堆排序,快速排序,归并排序,希尔排序,桶排序

    冒泡排序是一种简单的排序算法,通过不断交换相邻两个元素的位置来逐步将较大的元素推向数组的后部。它的主要思想是重复遍历数组,每次比较相邻的元素,如果顺序错误就交换。Java实现时,通常会设置一个标志位来...

    Java实现冒泡排序.rar

    在Java中,我们可以使用数组来实现冒泡排序。以下是关于Java实现冒泡排序的详细知识: 1. **冒泡排序原理**: 冒泡排序的核心思想是每次比较两个相邻的元素,如果它们的顺序错误就交换它们的位置。这个过程就像水...

    JAVA排序算法: 直接插入,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序

    本文将深入探讨Java编程语言中实现的七种主要排序算法:直接插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序以及归并排序。每种算法都有其独特性,适用于不同的场景和数据特性。 1. **直接插入排序**:...

    Java冒泡排序算法

    根据给定的部分代码,我们可以详细解析如何用Java实现冒泡排序: ```java public class BubbleSortExample { public static void main(String[] args) { // 定义一个整型数组 int[] numbers = new int[]{2, 4, 5...

    java实现各种排序 快速 插入 冒泡 选择

    本文将深入探讨四种经典的排序算法:快速排序、插入排序、冒泡排序和选择排序,它们都是计算机科学中广泛使用的排序方法。我们将通过Java代码实现这些算法,并进行简要的总结。 **快速排序** 是由C.A.R. Hoare在...

    Java实现冒泡排序算法

    冒泡排序是一种基础且经典的排序算法,其... Java中还有很多其他高效的排序算法,如快速排序、归并排序、堆排序等,它们在不同场景下有不同的优势。学习和理解这些排序算法有助于提升编程能力和解决实际问题的能力。

    冒泡排序java实现

    在Java中实现冒泡排序,我们可以创建一个名为`MyBubSort`的类,并在其中编写相应的函数。 首先,我们需要了解冒泡排序的基本步骤: 1. 比较相邻的元素,如果前一个比后一个大,则交换它们的位置。 2. 对每一对相邻...

    java实现的4种排序算法(冒泡、快速、插入、选择)

    冒泡排序是一种简单的交换排序,它通过重复遍历待排序的列表,比较相邻元素并根据需要交换它们来工作。这个过程就像水底下的气泡一样,小的元素逐渐“浮”到顶部。BuddleSort.java文件实现了该算法。冒泡排序的时间...

    各种java排序 归并排序 冒泡排序 选择排序

    冒泡排序是最简单的排序算法之一,通过不断交换相邻的逆序元素来逐步实现排序。这个过程就像水底下的气泡一样,大的元素会逐渐“浮”到数组的顶端。 **冒泡排序步骤**: 1. 比较相邻的元素,如果顺序错误就交换它们...

    各种排序算法比较(java实现)

    本文将详细探讨标题所提及的几种排序算法:合并排序、插入排序、希尔排序、快速排序、冒泡排序以及桶排序,并结合Java语言的实现进行解析。 1. **合并排序(Merge Sort)**: 合并排序是一种基于分治策略的排序算法...

    JAVA快速,选择,冒泡数组排序

    本主题将详细介绍三种基本的排序算法:快速排序、选择排序和冒泡排序,以及它们在Java中的实现。 1. **快速排序**: 快速排序是一种高效的分治算法,由C.A.R. Hoare在1960年提出。其主要思想是通过一趟排序将待排...

    Java实现冒泡排序算法(源代码)

    3. **不适用于大数据集**:对于大数据集,冒泡排序的效率远低于其他更高效的排序算法,如快速排序、归并排序等。 #### 四、Java实现冒泡排序 下面展示了一个典型的Java程序,用于实现冒泡排序: ```java public ...

Global site tag (gtag.js) - Google Analytics