冒泡算法(待排序元素较少)
1.原理
比较相邻元素(两两比较),保证最大元素像泡泡一样浮到每轮最上面(也就是最末尾的位置)

public static void main(String[] args) {
int[] arr={6,5,4,1,2,3};
for(int i=arr.length-1;i>0;i--) {
for(int j=0;j<i;j++) {
if(arr[j]>arr[j+1]) { //比较
int t=arr[j];
arr[j]=arr[j+1]; //交换
arr[j+1]=t;
}
}
}
System.out.println(Arrays.toString(arr));
}
2.时间复杂度
从最坏情况分析(6,5,4,3,2,1)
求和公式:(首项+末项)×项数/2
比较次数:
(N-1)+(N-2)+…+2+1=[((N-1)+1)*(N-1)]/2=N2/2-N2
交换次数:
(N-1)+(N-2)+…+2+1=[((N-1)+1)*(N-1)]/2=N2/2-N2
总次数:
(N2/2-N2)+(N2/2-N2)=N^2-N
O(N^2)(大O表示法取最高阶项)
选择排序(待排序元素较少)
1.原理
- 比较:每次遍历将第一个索引的元素作为最小值(min)的索引,和其他索引值依次比较,若min值大于其他索引值,则将min替换成其他索引值的索引(作为新的最小值位置)
- 交换:第一个索引处和min处的值

public static void main(String[] args) {
int[] arr={6,5,4,1,2,3};
//arr.length-2:边界定在这因为arr.length-1是最后一个元素,
//只有剩余两个元素才需要选择(谁大谁小),剩余一个就直接放那里就可以了
for(int i=0;i<arr.length-2;i++) {
int min=i; //最小索引设置为每轮第一个元素索引
for(int j=i+1;j<arr.length;j++) {
//比较
if(arr[j]<arr[min]) {
min=j; //选出每轮最小的索引
}
}
//交换
int t=arr[i];
arr[i]=arr[min];
arr[min]=t;
}
System.out.println(Arrays.toString(arr));
}
2.时间复杂度
从最坏情况分析
求和公式:(首项+末项)×项数/2
比较次数:
(N-1)+(N-2)+…+2+1=[((N-1)+1)*(N-1)]/2=N2/2-N2
交换次数:
(N-1)
总次数:
(N2/2-N2)+(N-1))=N^2-N/2-1
O(N^2)(大O表示法取最高阶项)
插入排序(待排序元素较少)
联想成抓扑克牌
1.把所有元素分成两组,已排序和未排序的
2.找到未排序的第一个元素,向已排序的进行插入
3.倒叙遍历(从最后一个往前遍历)已排序的元素,依次和带插入的元素进行比较,直到找到一个元素小于等于待插入元素,将待插入元素放到这个位置,其他元素向后移动一位(也是两两交换只不过是倒序交换)

public static void main(String[] args) {
int[] arr={6,5,4,7,1,2,3,7};
for(int i=1;i<arr.length;i++) { //边界:i=1开始是待排序元素,到最后一个元素结束
for(int j=i;j>0;j--) { //边界:j=i是待排序元素(倒着排),j>0到这默认第一个位置结束
//比较 j处小于前一个值
if(arr[j]<arr[j-1]) {
//交换
int t=arr[j];
arr[j]=arr[j-1];
arr[j-1]=t;
}else {
break; //j处比前一个元素大就停止 (使得已排元素有序)
}
}
}
System.out.println(Arrays.toString(arr));
}
从最坏情况分析
求和公式:(首项+末项)×项数/2
比较次数:
(N-1)+(N-2)+…+2+1=[((N-1)+1)*(N-1)]/2=N2/2-N2
交换次数:
(N-1)+(N-2)+…+2+1=[((N-1)+1)*(N-1)]/2=N2/2-N2
总次数:
(N2/2-N2)+(N2/2-N2)=N^2-N
O(N^2)(大O表示法取最高阶项)
本文深入讲解了冒泡排序、选择排序及插入排序三种基本排序算法的实现原理与过程,并通过具体示例代码演示了每种排序算法的工作方式。此外,还详细分析了这些算法的时间复杂度,帮助读者理解其效率特性。

627

被折叠的 条评论
为什么被折叠?



