冒泡排序
原理:冒泡排序,就是如同一个一个气泡一样有规律的冒出。在数组的排序实现,就是其中的最值一个个冒出到最后。
//冒泡排序
public static void bulle(int[] array) {
//冒出最值的次数(array.length-1 最后一个不需要冒泡 自然有序)
for(int i=0;i<array.length-1;i++) {
//冒泡排序核心:一个一个比较,冒出一个最值
//array.length-1-i array.length-1保证数组不会出现越界异常,
//每次冒泡后,排序好的不用冒泡比较所以每执行i次就有i次不需要排序
for(int j=0;j<array.length-1-i;j++) {
//冒出最大值
if(array[j]>array[j+1]) {
//交换
int temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
}
}
}
}
注意:在交换时 int temp变量应该写在循环外,不然每次交换多会生成一个temp变量浪费了空间。这里写在里边时为了更好的理解程序。
插入排序
原理:先取出一个数,接着再取出一个数和之前的的数,放在前或后面排序好,接着就是一个个去数插入已经排序好的数组中。
//插入排序
public static void insertSort(int[] arr) {
for(int i=0;i<arr.length;i++) {//从头一个个取出数arr[i]
for(int j=0;j<i;j++) {//和排序好的比较 数组下标从0到(i-1)已经排序好
if(arr[i]<arr[j]) {
int temp=arr[j];
arr[j]=arr[i];
arr[i]=temp;
}
}
}
}
选择排序
原理:找到数组最值的下标,通过下标实现把数放在指定位置(这里是把最值放在开头)。接着在剩余元素里边继续找最值,放到数组指定位置。
//选择排序
public static void selectSort(int[] arr) {
//查找最值次数
for(int j=0;j<arr.length;j++) {
int key=j;//默认最值下标为剩余数组第一个
for(int i=j;i<arr.length;i++) {
//找到最值
if(arr[i]<arr[key]) {
key=i;//剩余元素最值下标
}
}
//把最值放在数组前j的位置
int temp=arr[j];
arr[j]=arr[key];
arr[key]=temp;
}
}
快速排序
原理:第一次从数组中挑出一个数(一般用第一个数),通个比较把小于和大于它的数有规律放在它的两侧,一侧为大于它的一侧为小于它的,不需要在意左右两侧的顺序只需用挑出的数进行分开就行。接着对左、右两测分别进行之前的操作,取出一个数,然后小于和大于它的数分类。如此重复直到不能分为止数组就实现了排序。
这是转载的快速排序视频链接:快速排序视频
//快速排序
public static void quickSort(int[] arr, int left,int right){
if(left>=right) {
return;
}
int temp=arr[left];
int i=left;
int j=right;
while(i!=j) {
//找到左右两数
while(arr[j]>=temp&&i<j) {
j--;
}
while(arr[i]<=temp&&i<j) {
i++;
}
//交换
int t=arr[j];
arr[j]=arr[i];
arr[i]=t;
}
//跳出循环 中间数和基数交换
arr[left]=arr[i];
arr[i]=temp;
//递归排完所有
quickSort(arr,left,i-1);
quickSort(arr,i+1,right);
}
转载一下在别的地方看到的写的很好很详细的排序文章:十大经典排序算法