交换排序(冒泡排序、快速排序)——Java

交换排序

(1)冒泡排序

  1、基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

  2、实例

  3、java实现

	public static void main(String[] args)
	{
		int []nums={57,68,59,52};
		bubblesort1(nums);
	}

	/**
	 * 它重复地遍历过要排序的数列,一次比较两个元素,如果他们的顺序错误就交换过来
	 * 遍历数列的工作是重复进行的直到没有再需要交换
	 * 也就是说该数列已经排序完成
	 * 这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的前端
	 * 冒泡排序的特点:
	 * 如果在你的数据清单中只有一两个数据是乱序的话,用这种算法是最快的排序算法
	 * 如果你的数据清单中的数据是随机排序的话,那么这种方法就成了最慢的算法了
	 */
	public static void bubblesort1(int[] nums)
	{
		int len=nums.length;
		int temp=0;
		for (int i = len-1; i >0; i--)
		{
			for (int j = 0; j < i; j++)
			{
				if (nums[j]>nums[j+1])
				{
					temp=nums[j];
					nums[j]=nums[j+1];
					nums[j+1]=temp;
				}
			}
		}
	}

4、分析

  冒泡排序是一种稳定的排序方法。 

若文件初状为正序,则一趟起泡就可完成排序,排序码的比较次数为n-1,且没有记录移动,时间复杂度是O(n)

若文件初态为逆序,则需要n-1趟起泡,每趟进行n-i次排序码的比较,且每次比较都移动三次,比较和移动次数均达到最大值∶O(n2)

起泡排序平均时间复杂度为O(n2)

(2)快速排序

快排图

1、基本思想

设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。

一趟快速排序的算法是:

1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;

2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];

3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;

4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;

5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。

2、实例

3、java实现

import java.util.*;

public class quickSort
{
	/**
	它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,
	其中一部分的所有数据都比另外一部分的所有数据都要小
	然后再按此方法对这两部分数据分别进行快速排序
	整个排序过程可以递归进行,以此达到整个数据变成有序序列。
	*/
	public static void main(String[] args)
	{
		int[] nums={57,68,59,52,72,28,96,33,24,19};
		quick(nums);
		System.out.println(Arrays.toString(nums));
	}

	public static void quick(int[] nums)
	{
		if (nums.length>0)
		{
			quickSort1(nums,0,nums.length-1);
		}
	}
	public static void quickSort1(int[]nums,int low,int high)
	{
		if (low<high)
		{
			int mid=getMiddle(nums, low, high);
			quickSort1(nums, 0, mid-1);
			quickSort1(nums, mid+1, high);
		}
	}

	public static int getMiddle(int[] nums,int low,int high)
	{
		int temp=nums[low];
		while (low<high)
		{
			//找到比基准元素小的元素位置
			while (low<high&&nums[high]>=temp)
			{
				high--;
			}
			nums[low]=nums[high];
			while (low<high&&nums[low]<=temp)
			{
				low++;
			}
			nums[high]=nums[low];
		}
		nums[low]=temp;
		return low;
	}

}

  4、分析

  快速排序是不稳定的排序。

  快速排序的时间复杂度为O(nlogn)。

  当n较大时使用快排比较好,当序列基本有序时用快排反而不好。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-25 03:58:02

交换排序(冒泡排序、快速排序)——Java的相关文章

排序算法----快速排序java

快速排序是对冒泡排序的一种改进,平均时间复杂度是O(nlogn) import java.util.Arrays; import java.util.Scanner; public class test02{ public static void main(String[] args) { int n = 1; while (n != 0){ Scanner scanner = new Scanner(System.in); n = scanner.nextInt(); int s[] = ne

数据结构例程—— 交换排序之快速排序

本文是[数据结构基础系列(9):排序]中第5课时[交换排序之快速排序]的例程. 1.以第1个元素作为基准 #include <stdio.h> #define MaxSize 20 typedef int KeyType; //定义关键字类型 typedef char InfoType[10]; typedef struct //记录类型 { KeyType key; //关键字项 InfoType data; //其他数据项,类型为InfoType } RecType; //排序的记录类型定

交换排序:快速排序

快速排序(Quick Sort)也是一种交换排序,它在排序中采取了分治策略. 快速排序的主要思想: 从待排序列中选取一元素作为轴值(也叫主元). 将序列中的剩余元素以该轴值为基准,分为左右两部分.左部分元素不大于轴值,右部分元素不小于轴值.轴值最终位于两部分的分割处. 对左右两部分重复进行这样的分割,直至无可分割. 从快速排序的算法思想可以看出,这是一递归的过程. 两个问题: 要想彻底弄懂快速排序,得解决两个问题: 如何选择轴值?(轴值不同,对排序有影响吗?) 如何分割? 问题一:轴值的选取?

插入排序,希尔排序,堆排序,归并排序,快速排序Java实现

参看:数据结构与算法分析-c语言描述 public class Main { public static void main(String[] args) { String[] a = { "a", "d", "e", "f", "m" }; String[] b = { "a", "h", "g", "l", "z&

手写快速排序(java实现)

手写快速排序(java实现) 时间复杂度: O(nlogn) 快速排序原理: 定义一个基准元素base(我这里定义的是最左面的元素定位基准元素) 定义两个变量i和j j先从右向左遍历,找到第一个比base小的数就停止 i再从左向右便利找到第一个比base大的数停止 交换i和j指向的元素 直到i和j指向同一个元素,将这个元素与基准元素交换 递归求解即可 图解:(排序过程) 注意: 上图为第一次快速排序的过程,递归过程和上图一致(没有给出) 每一次的排序结果: 现在在火车上没有给出具体每次排序结果,

交换排序—冒泡排序(Bubble Sort)算法原理以及Java实现

基本思想: 在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒.即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换. 冒泡排序的示例: 算法实现 1 /** 2 * 3 * @author zhangtao 4 */ 5 public class BubbleSort 6 { 7 public static void main(String[] args) 8 { 9 int arr[]={3,1,5,

交换排序之快速排序

今天大鹏哥跟大家一起学习下交换排序中的快速排序. 快速排序是对冒泡排序的一种改进.它的基本思想是,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到真个序列有序. 快速排序基本步骤: Step1.定义两个变量low和high,他们的初值分别为low和high,此外还有一个变量pivotkey. Step2.首先从high所指位置向前搜索找到第一个关键字小于pivotkey的记录和pivotkey交换. Step3.从

数据结构---快速排序 &nbsp; java

快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 设要排序的数组是A[0]--A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过

冒泡排序优化JAVA

本文对传统的冒泡排序进行了一些优化,减少了循环次数. 时间复杂度 若文件的初始状态是正序的,一趟扫描即可完成排序.所需的关键字比较次数 C 和记录移动次数 M 均达到最小值: C(min)=n-1 , M(min)=0 .所以,冒泡排序最好的时间复杂度为 O(n); 若初始文件是反序的,需要进行  趟排序.每趟排序要进行  次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置.在这种情况下,比较和移动次数均达到最大值: 冒泡排序的最坏时间复杂度为O(n^2) . 综上

随机化快速排序(Java实现)

Randomized quicksort(随机化快速排序) running time is independent of input ordering. no assumption about the input distribution.(无需对输入序列分布做任何假设) no specific input elicit the worst-case behavior.(没有特定输入引起最差的运行效率) worst-case determined only by a random -number