排序
1. 冒泡排序
参考链接:冒泡排序
主要思想:从左到右,相邻元素进行比较,根据大小判断是否进行交换。每遍历完一次序列,都会找到一个最大的或最小的放在最右边。这样,经历n-1次,我们就可以将n个元素按一定顺序排列起来(这里是n-1而不是n,如果最大(小)的n-1个都到最右边了,最左边的一定是最小(大)的)。
代码如下:
public class Solution{
public int[] BubbleSort(int[] arr){
int length = arr.length;
int i, j, temp;
for(i = 0; i < length - 1; i++){ // n-1轮遍历序列
for(j = 0; j < length - 1 - i; j++){ // 每一次都是从左到右,比较次数为 n - 1 - i,因为前i轮遍历已经确定了i个最小(大)的数在最右边,不用再比较了
if(arr[j] < arr[j+1]){ // 此处是左边小于右边时交换,则最后跑到最右边的是最小的,也就是说数组被从大到小重排
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
return arr;
}
}
2. 快速排序
参考链接:快排及其优化、三种快排及四种优化方式
主要思想:选择一个基准值,将小于该值的元素放在其左边,将大于该值的元素放在其右边,再对左右分别进行递归处理。
代码如下:
public class Solution {
public void QuickSort(int[] a, int s, int t){
if(s < t){
int pivotloc = partition(a, s, t);
QuickSort(a, s, pivotloc - 1);
QuickSort(a, pivotloc + 1, t);
}
}
public int partition(int[] a, int low, int high){ // 一次划分,完成的工作是:“选择一个基准值,将小于该值的元素放在其左边,将大于该值的元素放在其右边”
int pivotkey = a[low]; // 选择基准值,此处选择最左边的元素
while(low < high){ // 停止条件就是low>=high, 即从左到右,从右到左的两个指针相遇了,说明所有的值都跟基准值比较过了
while(low < high && a[high] >= pivotkey){ //如果右边的大于基准值,就继续往左遍历,直到遇到一个小于基准值的
--high;
}
//swap(a, low, high); // 此时有两种原则, 一种是选择交换基准值与a[high],之后又会在此进行交换,基准值就到了一个新的位置
a[low] = a[high]; // 也可以选择先把a[high]放到他该去的位置,之后把a[low]放到他该去的位置,在整个循环结束后,再把基准值放到两个指针相遇的位置(这里有点没太说明白。。)
while(low < high && a[low] <= pivotkey){
++low;
}
//swap(a, low, high);
a[high] = a[low];
}
a[low] = pivotkey;
return low;
}
public void swap(int[] a, int i, int j){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
浙公网安备 33010602011771号