1)冒泡排序:
( 时间复杂度 O(n^2) )
长度为len的序列,一共进行(len-1)趟排序 ,每趟排序,两两比较相邻元素的值,如果发现逆序则进行交换。
其中,每趟排序 a)都要进行(len-1)次比较;b)都能确定一个最大值;
public static void bubbleSort(int[] arr){//静态方法访问
int count=0;
boolean flag=false;
for(int k=0;k<arr.length;k++){
for(int i=0;i<arr.length-1-k;i++){
int temp;
if (arr[i]>arr[i+1]){
flag=true;
temp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=temp;
}
}
if (!flag){
break;
}else{
flag=false;//重置flag
}
count++;
}
}
2)选择排序:
时间复杂度 O(n^2),但方法优于选择排序
说明:
1.选择排序一共有(arr.length-1)轮排序, 第i轮排序需要遍历从 i+1到 arr.length-1 的值
2.每一轮排序,又是一个循环,循环的规则(代码)
2.1 先假定当前这个数是最小数,将其值赋给变量min,其索引赋值给变量minIndex
2.2 将min与循环中的所有的值比较,如果找到比min小的,就重新给min和minIndex赋值,
2.3 当追历到数组的最后时,就得到本轮最小数和下标
3.根据索引交换[代码中再继续说〕
这边有一个优化,即找到的值的索引与假定的最小值的索引不相等时,才需要交换两个值的位置。
public static void selectSorting(int[] arr){
for(int i=0;i<arr.length-1;i++) {
int minIndex=i;
int min = arr[i];
for (int j = i+1; j < arr.length; j++) {
if (min > arr[j]) { //改成逆序只需改这边
min = arr[j];
minIndex = j;
}
}
if(minIndex != i){
arr[minIndex]=arr[i];
arr[i] = min ;
}
}
}
3)插入排序:
比冒泡和选择都要快;
长度为len的序列,一共要进行len-1轮
第i轮能确定i+1个有序数列,即每一轮将第i+2个值正确插入到前面已确定的有序序列中。
方法:
1)将待插入的值赋值给一个变量insertValue
将待插入的前一个值的索引赋给 insertIndex
2)进行循环,每一次循环,将待插入的值与 arr[insertIndex](即索引为insertIndex的值)比较,
如果不满足(insertValue < arr[insertIndex])这个关系,则将arr[insertIndex]后移一位,继续循环。
3)当跳出循环,即代表找到了要插入值的索引,将insertValue的值赋给这个索引的值即可。
重点步骤在于找到待插入数据的位置。
public static void insertSorting(int[] arr){
//给insertValue找到待插入位置
for(int i=0;i<arr.length-1;i++) {
int insertValue = arr[i+1];
int insertIndex = i;//待插入值的前一个位置的索引
//将arr[insertIndex]后移
while (insertIndex >= 0 && insertValue < arr[insertIndex]) {
arr[insertIndex+1]=arr[insertIndex];
insertIndex--;
}
//当推出while循环时,代表插入位置找到,insertIndex+1
arr[insertIndex+1]=insertValue;
}
}