插入排序:
/**
* 插入排序
* 初始时,拿第二个和第一个比较,如果第二个小于第一个,两个交换
* 当进行到第N次时,前面的N-1个顺序应该是正确的
* 拿第N个和前面的N-1个数比较,如果第M个小于N,M+1大于N,则把N插到M和M+1中间
* 相当于将N和前一个数比较,如果前一个数大于N,则把前一个移动到N的位置上,内层的每个循环都是将大于N的数字在向后移以为,也就相当于是将N插在两个之间。
*
* 时间复杂度:n+(n-1)+(n-2)+...+1 = (n+1)n/2=n^2 O(n^2) 空间复杂度:O(1) 稳定
* @Title: insertionSort
* @author: wanglh3
* @Description: TODO
* @param numbers
* @return void
*/
public static void insertionSort(int[] numbers){
for(int i=1;i < numbers.length;i++){
int temp = numbers[i];
int j = i-1;
for(; j >=0 && numbers[j]>temp ;j--){
if(temp < numbers[j]){
numbers[j+1] = numbers[j];
}
}
System.out.println(j+"----"+temp);
numbers[j+1] = temp;
}
}
二分排序算法应该是插入排序的优化算法,插入时不从一端查找,而是从中间开始查找。
冒泡排序
/**
* 冒泡排序
* 从后往前,先把最小的移到第一位,然后循环,把次小的移到第二位
* 冒泡排序法的改进:
* 1.设置一个标志变量,如果某一次排序中,没有进行交换,就可以停止排序
* 2.设置一个记录,标志某位之后都已经进行排序,之后排序时,无需对之后的元素进行比较
* 3.正向逆向同时排序
*
* 时间复杂度:O(n^2) 空间复杂度O(1) 稳定
* @Title: bubbleSort
* @author: wanglh3
* @Description: TODO
* @param numbers
* @return void
*/
public static void bubbleSort(int[] numbers){
for(int i = 1; i < numbers.length; i++){
for(int j = numbers.length-1; j >= i; j--){
if(numbers[j] < numbers[j-1]){
int temp = numbers[j];
numbers[j] = numbers[j-1];
numbers[j-1] = temp;
}
}
}
}
选择排序
/**
* 选择排序
* 从未排序的数中,选出最小的,与未排序的第一个数值交换
* 改进方法:二元选择排序
* 每次循环选出最大的和最小的,最小的和前面的交换,最大的和后面的交换
* 时间复杂度:O(n^2) 空间复杂度O(1) 不稳定
* @Title: selectionSort
* @author: wanglh3
* @Description: TODO
* @param numbers
* @return void
*/
public static void selectionSort(int[] numbers){
for(int i = 0; i < numbers.length-1; i++){
int index = i;
int temp = numbers[i];
for(int j=i+1;j<numbers.length;j++){
if(numbers[j]<temp){
temp = numbers[j];
index = j;
}
}
numbers[index] = numbers[i];
numbers[i] = temp;
}
}
/**
* 快速排序
* 选择一个基准,比他大的,都放到他后面,比他小的,都放到他前面
* 平均时间复杂度是O(nlogn),空间复杂度是O(logn) 不稳定
* @Title: quickSort
* @author: wanglh3
* @Description: TODO
* @param numbers
* @return void
*/
public static void quickSort(int[] numbers){
_quickSort(numbers,0,numbers.length-1);
}
public static void _quickSort(int[] numbers,int low,int high){
if(low < high){
int _low = partition(numbers,low,high);
_quickSort(numbers,low,_low-1);
_quickSort(numbers,_low+1,high);
}
}
//{3,7,9,4,2,8,0,1,5}
public static int partition(int[] numbers,int low,int high){
int privotKey = numbers[low];//基准数
while(low < high){
//如果num[high]>pri num[low] = num[high]
//high--
//
while(low < high && numbers[high]>=privotKey){
high--;//当高位大于基准值时,一直向前移动,直到碰到小于基准值的,跳出循环,将高位赋值给低位
}
numbers[low] = numbers[high];
while(low < high && numbers[low] <= privotKey){
low++;
}
numbers[high]=numbers[low];
System.out.println();
}
numbers[low] = privotKey;
return low;
}
//------------快排end----------------