快速排序原理:
第一步:给定一个有若干元素的数组,在这个数组中选定一个基准数据(通常是第一个或最后一个);
第二步:从数组两端开始依次轮流与基准数据比较,将比基准数据小的放到基准数据左边区间(或右边),将比其大的数据放到基准数据的右边区间(或左边);
第三步:对左右两个区间分别重复第二步的操作,直到各区间只剩下一个数。
代码实现:
public class Test {
public static void quickSort(int[] array, int begin, int end) {
if(begin < end) {
int index = getIndex(array , begin , end);//获取基数位置
//递归调用
quickSort(array, begin , index-1);
quickSort(array , index + 1 ,end);
}
}
public static int getIndex(int[] arr, int begin, int end) {
int temp = arr[begin];//定基准数据
while(begin < end) {//两端数据轮流与基数比较
while(begin < end && arr[end] >= temp) {//比较后面的数据与基准数据
end --;
}
arr[begin] = arr[end];//将小的数据放到左边区间
while(begin < end && arr[begin] <= temp) {//比较前面的数据与基准数据
begin++;
}
arr[end] = arr[begin];//将大的数据放到左边区间
}
arr[begin] = temp;
return begin;//返回基准数据的位置
}
public static void main(String[] args) {
int[] arr = {7,3,4,6,2,8,1,5};
quickSort(arr, 0, arr.length-1);
for(int i=0; i<arr.length;i++) {
System.out.print(arr[i]+"\t");
}
}
}
总结
快速排序,说白了就是给基准数据找其正确索引位置的过程.(查资料的时候,某个大佬说的)
归并排序
归并排序与快速排序有些相似,也是利用分治的思想。先将待排序的数组分成若干子序列,将每个子序列排好顺序后,再将排好序的两个(或两个以上)子序列合并成一个新的有序序列,一直重复这个操作,知道剩下一个完整的序列。
public class Test {
public static void main(String[] args) {
int[] arr = {4,2,5,1,7,3,8,6};
mergeSort(arr,0,arr.length-1);
for (int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
}
public static void mergeSort(int[] array,int low,int high){
int mid = (low + high)/2;
if(low < high){
mergeSort(array,low,mid);
mergeSort(array,mid+1,high);
sort(array,low,mid,high);
}
}
pub lic static void sort(int[] array, int low , int mid , int high){
int[] temp = new int[high-low+1];
int leftLow = low;
int rightLow = mid+1;
int k=0;
while(leftLow<= mid && rightLow <= high){
if(array[leftLow] < array[rightLow]) {
temp[k++] = array[leftLow++];
}else temp[k++] = array[rightLow++];
}
while(leftLow <= mid){
temp[k++] = array[leftLow++];
}
while(rightLow <= high){
temp[k++] = array[rightLow++];
}
for( k=0; k < temp.length ; k++){
array[k+low] = temp[k];
}
}
}