1.冒泡排序
冒泡排序的主要思想就是将最大的数“沉底”,即每次循环将最大的放在数组最后一位,之后的循环依次将大数后置。
* 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
* 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
* 针对所有的元素重复以上的步骤,除了最后一个。
* 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
public void bubbleSort(int arr[]){
int temp;
for(int i=0;i<arr.length-1;i++){ //i循环的是次数
for(int j=0;j<arr.length-1-i;j++){ //每次循环将大数放在最后一位,
if(arr[j]>arr[j+1]){ //对相邻的数进行比较,将大数后置。
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
2.选择排序
选择排序是在所有数据中,找到数值最小的数,将这个数置于数组的首位,在之后的循环中,依次将小数前置。
* 在未排序序列中找到最小元素,存放到排序序列的起始位置
* 再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。
* 以此类推,直到所有元素均排序完毕。
public void selectSort(int arr[]){
int k,temp;
for(int i=0;i<arr.length; i++){
k = i;
for(int j=i+1; j<arr.length; j++){ //重复循环比较以找到最小的数
if(arr[k]>arr[j]){
k=j; //确定最小数的下标
}
}
if(k != i){
temp = arr[i];
arr[i] = arr[k];
arr[k] = temp; //把小数前置
}
}
}
3.插入排序
插入排序可以将其想象为玩扑克牌,右手摸来的牌是无序的,而左手理好的的牌是有序的,将右手边无序的牌插入到有序的牌中,插入排序正是如此。
* 从第一个元素开始,该元素可以认为已经被排序
* 取出下一个元素,在已经排序的元素序列中从后向前扫描
* 如果该元素(已排序)大于新元素,将该元素移到下一位置
* 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
* 将新元素插入到该位置中
* 重复步骤2
public void insertSort(int arr[]){
for(int i=1;i<arr.length;i++){ //在第二个数开始遍历,把第一个数看作有序
int temp = arr[i];
for(int j=i-1;j>=0;j--){ //通过for循环判断无序的数将要插入在数组中的位置
if(temp<arr[j]){
arr[j+1] = arr[j]; //将每一个比temp大的数右移一位
}else{
break; //当有一个数比temp小时,跳出循环
}
}
arr[j+1] = temp; //插入数据
}
}
4.快速排序
快速排序指的是,以一个数为基准,按照该基准数左面的数小于该数,右面的数大于该数的原则,每次循环将数组中的数排列。之后分别以该数左右两边的所有数为基准全部进行循环,最终得到排列好的结果。
* 从数列中挑出一个元素,称为“基准”
* 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分割之后,
该基准是它的最后位置。这个称为分割(partition)操作。
* 递归地把小于基准值元素的子数列和大于基准值元素的子数列排序。
public void quickSort(int arr[], int low, int high){
int i, j, t, temp;
if(low>high){
return;
} //要求传入的值必须是low<high
i = low;
j = high;
temp = arr[i];
while(i != j){
while(i<=j && temp<arr[j]){ //一定要让右边的j首先向左移动
j--; //每次j循环向左移动一位
}
while(i<j && temp>=arr[i]){
i++; //每次循环向右移动一位
}
if(i < j){ //如果满足条件则交换(小数左移,大数右移)
t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
if(i==j){
arr[low] = arr[i]; //当i和j值相同,即该两个指针指向统一位置时,将i和j相等的位置交换
arr[i] = temp; //将初始首位置的值赋值给“中间”位置
}
quickSort(arr, low, i-1); //执行左半边的快速排列
quickSort(arr, i+1, high); //执行右半区的快速排列
}
5.希尔排序
希尔排序就是对直接插入排序的一个优化。现在有一个array,希尔排序就是设定一个增量step(0<step<array.length)。
先从array[0]开始,以step为增量的进行直接插入排序,直到数组末尾,然后从array[1]开始重复:
以step为增量的进行直接插入排序; 然后从array[1]开始重复…一直到array[n]。然后取一个小于上一步增量的新的增量(比如设置为step/2),
对前一个步骤的结果array进行遍历,直接插入排序…,再取小于上一步增量的新的增量,
重复进行:遍历,直接插入排序直到新的增量小于1之后再退出循环。
public class ShellSort {
public void shellSort(int[] arr) {
if(arr==null || arr.length<=1) {
return;
}
int increaseNum = arr.length / 2;
int temp;
while(increaseNum>=1) {
for(int i = increaseNum; i < arr.length; i++) {
temp = arr[i]; //temp保存当前arr[i]的值
int j = i-increaseNum; //j 是 i的上一周期的值
while(j >= 0 && arr[j] > temp) { //当排序在数列前的数大于数列后的数时,执行插入排序
arr[j+increaseNum] = arr[j];
j = j-increaseNum;
}
arr[j + increaseNum] = temp;
}
increaseNum = increaseNum/2; //设置新的增量
}
}