首先列出常用排序算法时间/空间复杂度
1. 冒泡排序
像冒泡一样把最大/小的数浮上来。冒泡排序从小到大排序:
- 一开始交换的区间为0~N-1,将第1个数和第2个数进行比较,前面大于后面,交换两个数,否则不交换。
- 再比较第2个数和第三个数,前面大于后面,交换两个数否则不交换。
- 依次进行,最大的数会放在数组最后的位置。然后将范围变为0~N-2,数组第二大的数会放在数组倒数第二的位置。依次进行整个交换过程,最后范围只剩一个数时数组即为有序。
public void BubbleSort(int arry[]){
int t=0;
for(int i=0;i<arry.length-1;i++)
for(int j=0;j<arry.length-i-1;j++)
if(arry[j]>arry[j+1])
{
t=arry[j];
arry[j]=arry[j+1];
arry[j+1]=t;
}
System.out.print(Arrays.toString(arry));
}
2. 选择排序
在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。
public void selectSort(int arr[]){
for(int i = 0; i < arr.length - 1; i++) {// 做第i趟排序
int k = i;
for(int j = k + 1; j < arr.length; j++){// 选最小的记录
if(arr[j] < arr[k]){
k = j; //记下目前找到的最小值所在的位置
}
}
//在内层循环结束,也就是找到本轮循环的最小的数以后,再进行交换
if(i != k){ //交换a[i]和a[k]
int temp = arr[i];
arr[i] = arr[k];
arr[k] = temp;
}
}
}
3.插入排序
每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置,直到全部插入排序完为止。
public void insertSort(int arry[]){
int temp=0;
for(int i=1;i<arry.length;i++)
//假设0位置已放好位置,后面的数字就是插入到它左右的问题
if(arry[i]<arry[i-1]){//某个数比前一个数小
temp=arry[i];//缓存下arry[i]
for(int j=i-1;j>=0&&arry[j]>temp;j--){
//前i-1个数都有序,当前比较的数arry[j]比temp大,就把这个数后移一位
arry[j+1]=arry[j];
}
arry[j+1]=temp;
}
System.out.print(Arrays.toString(arry));
}
4.快速排序
快速排序从小到大排序:在数组中随机选一个数(默认数组首个元素),数组中小于等于此数的放在左边,大于此数的放在右边,再对数组两边递归调用快速排序,重复这个过程。
public void quick(int arry[]){//入口函数
quickSort(arry,0,arry.length-1);
}
public void quickSort(int arry[],int left,int right)
//递归划分子序列
{
if(left<right)
{
int middle=getMiddle(arry,left,right);
quickSort(arry,0,middle-1);
quickSort(arry,middle+1,right);
}
}
public int getMiddle(int[] arr, int left, int right{
int temp = arr[left];
while(left < right) {
while(left < right && arr[right] >= temp)
right --;
arr[left] = arr[right]; //把小的移动到左边
while(left < right && arr[left] <= temp)
left ++;
arr[right] = arr[left]; //把大的移动到右边
}
arr[left] =temp; //最后把temp赋值到中间
return left;
}