【数据结构与算法】排序

1选择排序:

常用的选择排序有直接选择排序和堆排序两种。堆排序是一种基于完全二叉树的排序。

package cn.ls.sort;
/**
 * 
 *选择排序之直接选择排序。
 */
public class MySelectSort {
	public static void main(String[] args) {
		int[] array = {64, 7, 5, 89, 6, 24, 5};
		//直接选择排序中第1次排序要进行n-1次比较,第2次排序要进行n-2次比较...
		//比较次数 = (n-1)+(n-2)+...+1 = n(n-1)/2.
		SelectSort(array);
		for (int i=0; i<array.length; i++){
			System.out.print(array[i]+"  ");
		}
	}
	/**
	 * 直接选择排序
	 * @param array
	 */
	private static void SelectSort(int[] array) {
		int x,y,small;
		for( x = 0; x<array.length-1; x++){
			small = x;
			for (y = x+1; y<array.length; y++){
				if (array[small]>array[y]) small = y;//记录最小下标值.array[y]要和先前最小元素进行比较.
			}
			if(small != x){
				//交换.注意:交换可能引起相同数据元素位置发生变化.
				//swap(array, x, small);
				
				//错位赋值可以保证排序算法的稳定性.
				int temp = array[small];
				for (y=small; y>x; y--){
					array[y] = array[y-1];//把该区尚未排序的数值依次后移.
				}
				array[x] = temp;
			}
		}
	}

	private static void swap(int[] array, int x, int small) {
		int temp = array[x];
		array[x] = array[small];
		array[small] = temp;
	}
}

2交换排序:

常用的交换排序方法有冒泡排序和快速排序。快速排序是一种分区交换排序方法。

package cn.ls.sort;
/**
 * 
 *交换排序之冒泡排序.
 */
public class MyBubbleSort {
	public static void main(String[] args) {
		int[] array = {5, 64, 7, 89, 6, 24};
		bubbleSort(array);
		//输出结果.
		for (int i=0;i<array.length;i++){
			System.out.print(array[i]+"  ");
		}
	}
	/**
	 * 
	 *冒泡排序:内循环结束一次,最值出现在末角标位。是一种稳定的排序方法。
	      相邻两个元素比较。
	 */
	private static void bubbleSort(int[] array) {
		int flag = 1;//flag变量,如果数据已全部排好,则提前结束排序。
		for (int x= 0; x<array.length-1 && flag == 1; x++){
			flag = 0;
			for (int y=0; y<array.length-1-x; y++){//-1:避免角标越界,-x:减少参与比较的元素。
				if (array[y]>array[y+1]){
					flag = 1;
					swap(array, y);
				}
			}
		}
	}
	/**
	 * 交换数据元素.
	 * @param array
	 * @param y
	 */
	private static void swap(int[] array, int y) {
		int temp = array[y];
		array[y] = array[y+1];
		array[y+1] = temp;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值