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