主要的排序算法介绍

关于排序,本人一直没有深入研究过,在实际的编码中,也偶尔有用到过排序,但我一直都是用的我自己的笨方法(后来知道这种方法的统称叫做选择排序,在后面的排序算法介绍中,我会首先介绍这种我最擅长的排序算法),随着自己编码经验的积累,感觉排序这一块,还是有必要学习一下的,所以就在网上搜索学习了一下主要的排序算法,因为是主要,所以只有八种,以下会用Java代码挨个介绍。


1)、选择排序(Selection Sort)

排序原理:一个数据序列有N个数据元素,那么需要执行N次选择排序:比如第1次排序时把最小的数据元素放在第一个位置,第二次把第2小的元素放在第二个位置,以此类推。

算法特点:时间复杂度为O( N^2 ),不怎么稳定,适用于所有的数据元素。

代码示例:

public class SortAlgorithm{
	public static void main(String args[])
	{
		int []arr = {3,5,7,23,56,23,67,35,67,89,1};
		System.out.println("这是未排序之前:");
		for(int i=0; i < arr.length; i++)
			System.out.print(arr[i]+"  ");
		System.out.println();
		
		Sort sortProcess = new Sort();
		sortProcess.selectionSort(arr);
		System.out.println("这是未排序之后:");
		for(int i=0; i < arr.length; i++)
			System.out.print(arr[i]+"  ");
	}
}

class Sort{
	public void selectionSort( int[] _a) //选择排序法
	{
		for( int pass=0; pass<_a.length; pass++ ) //pass之前的都是已经排序好的
		{
			for( int i=pass+1; i<_a.length; i++ ) //我们只需在pass后面的无序序列中遍历一下,找到最小的元素放在pass位置即可
			{
				if( _a[i] < _a[pass] )
				{
					int temp = _a[i];
					_a[i] = _a[pass];
					_a[pass] = temp;
				}
			}
		}
	}
}
程序运行效果如图:


2)、插入排序(InsertSort)

排序原理:这个与选择排序有点类似,也把整个数据序列分为有序和无序两个序列,有序的逐渐扩大,无序的逐渐减小。但与选择排序不同的是:插入排序是把无序序列中最前面的那个数据(还是按照升序排序)插入到有序序列中的合适位置,使得插入后有序序列依然保持有序。

算法特性:时间复杂度O( N^2 ),适用于所有数据元素。

代码示例:

public class SortAlgorithm{
	public static void main(String args[])
	{
		int []arr = {3,5,7,23,56,23,67,35,67,89,1};
		System.out.println("这是未排序之前:");
		for(int i=0; i < arr.length; i++)
			System.out.print(arr[i]+"  ");
		System.out.println();
		
		Sort sortProcess = new Sort();
		sortProcess.insertSort(arr);
		for(int i=0; i < arr.length; i++)
			System.out.print(arr[i]+"  ");
	}
}

class Sort{
	
	void insertSort(int[] a)
	{
		int i;
		for( int pass=1; pass<a.length; pass++) //这个pass就是每次从无序序列中拿出的代插入元素的位置
		{
			int temp = a[pass]; //先保存一下这个待插入元素
			for( i=pass-1; i>=0; i--)
			{
				if( a[i] < temp ) //如果发现有序中的某个元素小于待插入元素,那么就无需再扫描前面的有序数列了
					break;
				else
					a[i+1] = a[i];
			}
			
			a[i+1] = temp; //小循环结束,把待插入元素放到这个合适的位置
		}
		
		System.out.println("现在我们使用的是插入排序法,排序后如下:");
	}
}
程序运行效果如图:


3)、冒泡排序(Bubble Sort )

算法原理:比如说我们要进行升序排列,那么先从最前面开始,对挨个相邻的两个数据进行比较,如果发现前面的数据大于后面的那个,那么交换它们,然后再比较下一对相邻的,以此类推,这样比完一组之后,最大的数据就在最后面了。再然后再以此类推,把第2大的数据放在倒数第2个位置。。。

算法特性:时间复杂度O( N^2 ),适用于所有数据类型。

代码示例:

public class SortAlgorithm{
	public static void main(String args[])
	{
		int []arr = {3,5,7,23,56,23,67,35,67,89,1};
		System.out.println("这是未排序之前:");
		for(int i=0; i < arr.length; i++)
			System.out.print(arr[i]+"  ");
		System.out.println();
		
		Sort sortProcess = new Sort();
		sortProcess.bubbleSort(arr);
		for(int i=0; i < arr.length; i++)
			System.out.print(arr[i]+"  ");
	}
}

class Sort{
	void bubbleSort( int[] a)
	{
		int last = a.length-1; //用last表示成功冒泡数据的前一个位置
		for( int pass=0; pass<a.length; pass++ )
		{
			for( int i=0; i<last; i++ )
			{
				if( a[i] > a[i+1] )
				{
					int temp = a[i];
					a[i] = a[i+1];
					a[i+1] = temp;
				}
			}
			last--; //到这里说明成功的冒出一个大泡,把last往前推一个位置
		}
		System.out.println("冒泡排序处理过之后:");
	}
}
程序运行效果如图:


(先写这么多,以后有空会把后面几个较为复杂点的补上来)

十种排序算法介绍 转自:matrix67 今天我正式开始挄照我癿目彔写我癿 oi 心得了。我要把我所有学到癿 oi 知识传给以后千千万万癿 oier。以前写过 癿一些东西丌复写了,但我最后将会新整理,使乊成为一个完整癿教程。 ???? 挄照我癿目彔,讲仸何东西乊前我都会先介绍旪间复杂度癿相关知识,以后劢丌劢就会扯到这个东西。这个 已经写过了,你可以在这里看到那篇又臭又长癿文章。在讲排序算法癿过程中,我们将始终围绕旪间复杂度癿内容 迚行说明。 ???? 我把这篇文章称乊为“仍零开始学算法”,因为排序算法是最基础癿算法,介绍算法旪仍各种排序算法入手是 最好丌过癿了。 ???? 给出 n 个数,怎样将它们仍小到大排序?下面一口气讲三种常用癿算法,它们是最简单癿、最显然癿、最容 易想到癿。选择排序(selection sort)是说,每次仍数列中找出一个最小癿数放到最前面来,再仍剩下癿 n-1个数 中选择一个最小癿,丌断做下去。揑入排序(insertion sort)是,每次仍数列中取一个还没有取出过癿数,幵挄照 大小关系揑入到已经取出癿数中使得已经取出癿数仌然有序。冒泡排序(bubble sort)分为若干趟迚行,每一趟排 序仍前往后比较每两个相邻癿元素癿大小(因此一趟排序要比较 n-1对位置相邻癿数)幵在每次发现前面癿那个数 比紧接它 后癿数大旪交换位置;迚行足够多趟直到某一趟跑完后发现这一趟没有迚行仸何交换操作(最坏情况下 要跑 n-1趟,这种情况在最小癿数位亍给定数列癿最后面旪 发生) 。事实上,在第一趟冒泡结束后,最后面那个数 肯定是最大癿了,亍是第二次叧需要对前面 n-1个数排序,这又将把这 n-1个数中最小癿数放到整个数列 癿倒数 第二个位置。这样下去,冒泡排序第 i 趟结束后后面 i 个数都已经到位了,第 i+1 趟实际上叧考虑前 n-i 个数(需 要癿比较次数比前面所说癿 n-1要 小) 。这相当亍用数学归纳法证明了冒泡排序癿正确性:实质不选择排序相同。 上面癿三个算法描述可能有点模糊了,没明白癿话网上找资料,代码和劢画演示遍地 都是。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值