常用排序

一、插入排序

每次将一个待排序的数据元素,按照其关键字大小插入到前面已排好序的有序序列的适当位置,使插入以后的数据序列仍然为一个有序序列,直到整个序列成为有序序列为止。

1.直接插入排序

插入排序过程需要将待插入的元素和所有的元素进行比较

/**
 * 直接插入排序
 * 将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据    
 * 算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。
 */
public void insertSort(int[] data){
	int len=data.length;//数组的长度
	for(int i=1;i<len;i++){
		//取数组的除第一个之外的所有值
		int currentData=data[i];
		int temp=i;
		//数组向右移
		while(temp>0&&data[temp-1]>currentData){
			data[temp]=data[temp-1];
			temp--;
		}
		data[temp]=currentData;//交换数据
	}
}


2.折半插入排序

将待插入数据与当前有序序列中的平分位置的关键字数据进行比较,从而确定下一步要确定的子序列,直到找到插入的合适位置。

/**
 * 折半插入法
 * 直接插入排序的一种改进,在直接插入排序算法中,向有序序列中插入一个元素,插入位置是把
 * 待插入元素关键字与有序序列中元素的关键字逐个比较得到的。
 * @param data
 */
public void binaryInsertSort(int[] array){
	for (int i = 1; i < array.length; i++) {
		int temp = array[i];
		int low = 0;
		int high = i - 1;
		while (low <= high) {
			int mid = (low + high) / 2;
			if (temp < array[mid]) {
				high = mid - 1;
			} else {
				low = mid + 1;
			}
		}
		//数组后移
		for (int j = i; j >= low + 1; j--) {
			array[j] = array[j - 1];
		}
		array[low] = temp;
	}
}


3.希尔排序

先将整个待排序序列分割成若干子序列,每个子序列由相关一定长度的数据元素组成(这个相差的长度称为增量),然后我们分别对这些子序列进行直接插入排序,一轮排序后再取第二个增量,以此类推,需要注意的是,对于希尔排序中增量的确定没有统一的规定,通常的做法是:第一个增量为待排序序列长度的二分之一(取整),然后逐渐减半(取整),直到等于1为止。

/**
 * 希尔排序方法
 * @param data
 * int[] data={9,2,5,15,66,4,37,3,7};
 * 数组长度为9  步长len为4 
 */
public void shellSort(int[] data){
	int length=data.length;//数组的长度
	int len=length/2;//分割集合的间隔长度,初始值为数组长度的一半(步长)
	int temp;//临时变量(比较交换时使用)
	int pointer;//进行比较的下标位置
	//1.按每次减半分步长,直到步长为1
	while(len>0){
		for(int i=len;i<length;i++){
			//2.计算要各当前值进行比较的位置
			pointer=i-len;
			temp=data[i];
			//3.临时变量与集合内数据进行比较
			while(pointer>=0&&temp<data[pointer]){
				data[pointer+len]=data[pointer];
				pointer=pointer-len;
			}
			data[pointer+len]=temp;
		}
		len/=2;//每次递减一半
	}
}


二、交换排序:利用交换数据元素的位置进行排序的方法称为交换排序

1.冒泡排序

/**
 * 冒泡排序法
 * @param data
 */
public void maoPao(int[] data){
	int len=data.length;
	int temp;//临时变量
	for(int j= len-1;j>1;j--){
		for (int i = 0; i < j; i++) {
			if(data[i]>data[i+1]){
				temp=data[i];
				data[i]=data[i+1];
				data[i+1]=temp;
			}
		}
	}
}


2.选择排序

/**
 * 选择排序
 * @param data
 */
public void selectionSort(int[] data){
	int len=data.length;
	int out,in;//外层和内层循环的控制变量
	int min;
	int temp;
	for(out=0;out<len-1;out++){
		min=out;
		for(in=out;in<len;in++){
			if(data[in]<data[min])
				min=in;
		}
		if(min!=out){
			temp=data[min];
			data[min]=data[out];
			data[out]=temp;
		}
	}
}



原文地址:https://www.cnblogs.com/xinyuyuanm/p/2998667.html