算法原理及代码实现
一、选择排序算法的原理
选择排序简单的来说就是拿第一个数和剩下的数去比较,找出最小的数之后和第一个数交换,以此类推进行n-1次的比较得到一个新的排序方法。
下面展示一些 内联代码片
。
//选择排序法
package arraylist;
public class SeletionSort {
//首先定义一个整体的框架,能够打印出来数值
//2.找出最小的值的位置
//3.交换位置
//4.进行整体的排序,多加入一个循环,进行变化选择排序
//5.优化算法:将重复的代码设置为一个方法.打印和交换
public static void main(String[] args) {
int[] arr= {5,6,8,3,9,7,2,4};
for(int i=0;i<arr.length-1;i++) {//保证i+1后面有位置
int minPos=i;
for(int j=i+1;j<arr.length;j++) {
// if(arr[j]<arr[minPos])
// minPos=j;
minPos=arr[j]<arr[minPos]? j:minPos;
}
swap(arr,i,minPos);
// int temp=arr[i];
// arr[i]=arr[minPos];
// arr[minPos]=temp;
System.out.println("经过第"+i+"次");
// for(int i1=0;i1<arr.length;i1++) {
// System.out.print(arr[i1]+" ");
// }
print(arr);
System.out.println("minPos:"+minPos+" 数值为"+arr[minPos]);
}
print(arr);
}
static void swap(int[] arr,int i,int j) {
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
static void print(int[] arr) {
for(int i1=0;i1<arr.length;i1++) {
System.out.print(arr[i1]+" ");
}
}
}
选择排序经历了里外两次For循环,时间复杂度为***O(n^2)***,算法是不稳定的,大佬可以列举出不稳定的例子?
二、冒泡排序算法的原理
冒泡排序简单的来说就是相邻两个数进行比较,将较大的数向后排列,以此类推进行n-1次的比较得到一个新的排序方法,与选择排序不同的是冒泡排序是从后向前,由大而小排列的,选择排序是从小向大进行排序的。
下面展示一些 冒泡代码片
。
//冒泡排序法
public class BubbleSort {
public static void main(String[] args) {
int[] arr= {5,6,8,3,9,7,2,4};
for(int j=0;j<arr.length-1;j++) { //for(int j=arr.length-1;j>0;j--)
for(int i=0;i<arr.length-1-j;i++) {
if(arr[i]>arr[i+1]) {
swap(arr,i,i+1);
}
}
}
print(arr);
}
static void swap(int[] arr,int i,int j) {
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
static void print(int[] arr) {
for(int i1=0;i1<arr.length;i1++) {
System.out.print(arr[i1]+" ");
}
}
}
冒泡排序的时间复杂度为***O(n^2)***,算法是比选择排序稳定的。
三、插入排序算法的原理
插入排序比较重要,对于基本有序的数组最好用,简单的来说就是拿中间的数一直和前面的数进行比较,个子小的就往前面站,大的靠后站。相当于我们在整齐的队伍中插入一个重新排列,每进行一次前面的队伍都是整齐的,随后将后面的数插入一个进行比较归位。
下面展示一些 插入排序代码片
。
//插入排序法
package arraylist;
public class InsertSort {
public static void main(String[] args) {
int[] arr= {6,5,8,3,9,7,2,4};
for(int j=1;j<arr.length;j++) {
for(int i=j;i>0;i--) {
if(arr[i]<arr[i-1])
swap(arr,i,i-1);
}
}
print(arr);
}
static void swap(int[] arr,int i,int j) {
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
static void print(int[] arr) {
for(int i1=0;i1<arr.length;i1++) {
System.out.print(arr[i1]+" ");
}
}
}
插入排序的时间复杂度为循环套循环,所以时间复杂度也为***O(n^2)***,但算法是比选择和冒泡排序计算量小。
四、简单总结选择、冒泡、插入排序算法
选择排序算法:基本不用,不稳定;
冒泡排序算法:两两比较太慢,基本不用;
插入排序算法:样本小且基本有序的时候效率比较高。基本有序就减少交换次数。