一.冒泡排序
冒泡排序,就是每次比较,大的元素往后挪,比较完第一遍后,最大的元素排到了数组的最后一位 。第二次比较,还是从第一个元素开始和后面的比较,把剩余的最大的元素拍到数组的倒数第二位,第一轮比较的最大元素不参与比较 。
程序实现:
/*冒泡排序*/
public class Sort1 {
public int[] sort(int[] nums){
int temp = 0;
for(int i = 0; i < nums.length-1; i++){
for(int j = 0; j < nums.length-1-i; j++){
if(nums[j] > nums[j+1]){
temp = nums[j+1];
nums[j+1] = nums[j];
nums[j] = temp;
}
}
}
return nums;
}
}
二.快速排序
关键词:基准点放中间,两个哨兵头碰头
快速排序的核心思想就是找到一个基准数,把它放在中间,左边都是比他小的,右边都是比他大的。然后再以此为分界线,左右两边依次照此规则递归即可。
具体如何将一个数放在中间,我们通常选取最左边的一个数作为基准数,主要思想就是两个哨兵,左侧哨兵从最左侧向右移动,找到比基准数大的数停止,右侧哨兵从最右侧向左移动,找到比基准数小的数停止,然后交换。直至左哨兵与右哨兵相遇,再将基准数同他们交换,即可完成。
程序实现:
public class Sort2 {
public void sort(int[] nums, int left, int right){
if(left<right){
int q = Partition(nums, left, right);
sort(nums, left, q-1);
sort(nums, q+1, right);
}
}
private int Partition(int[] nums, int left, int right){
int i = left+1;
int j = right;
int tmp;
while(true){
while (nums[j] > nums[left] && j != i) j-=1;
if(j==i) break;
while (nums[i] < nums[left] && j != i) i+=1;
if(j==i) break;
tmp = nums[j];
nums[j] = nums[i];
nums[i] = tmp;
}
tmp = nums[j];
nums[j] = nums[left];
nums[left] = tmp;
return i;
}
}
参考资源:
坐在马桶上看算法:快速排序
三.简单选择排序
非常简单的排序算法,注意区分和冒泡的区别。
具体思想就是,拿第一个依次和后面的每一个比,遇到比他小的就换,一直比到头,第一个就是最小的了。然后再拿第二个依次和后面比,一直到头,小了就换。以此类推。
程序实现
/*简单选择排序*/
public class Sort3 {
public<