快速排序
快排快速完成写法(模板):
/**
* 1:l是否小于r 不小于终止
* 2:确定比较值x,临时变量i,j(双指针)
* 3:如果i<j循环
* 3.1:i先加一再判断k[i]是否小于x 不满足终止
* 3.2:j先减一再判断k[j]是否大于x 不满足终止
* 3.3:k[i]和k[j]交换
* 4:递归右边,递归左边
* @param k 需要排序的数组
* @param l 左边界
* @param r 右边界
*/
void quick_sort(int[] k,int l,int r){
if(l>=r){
return;
}
int x = k[l],i = l-1,j = r+1;
while(i<j){
do{
i++;
}while(k[i]<x);
do{
j--;
}while(k[j]>x);
if(i<j){
int t = k[i];
k[i] = k[j];
k[j] = t;
}
}
quick_sort(k,l,j);
quick_sort(k,j+1,r);
}
/**
*调用以及测试
*/
quick_sort(nums,0,nums.length-1);
for (int i = 0;i<nums.length;i++){
System.out.print(nums[i]+",");
}
归并排序
/**
* 1:确定平分点
* 2:递归左侧,递归右侧
* 3:合并左右两侧的有序数组
* @param q 需要排序的数组
* @param l 左边界
* @param r 右边界
*/
public class MergeSort {
final int N = 10000010;
int[] q = new int[N],tmp = new int[N];
void merge_sort(int q[],int l,int r){
if (l>=r){
return;
}
int mid = l+r >>1;
merge_sort(q,l,mid);
merge_sort(q,mid + 1,r);
//k是临时数组中合并了几个数了
int k = 0,i=l,j=mid +1;
while (i<=mid && j<=r){
if (q[i]<=q[j]) {
tmp[k++] = q[i++];
}else {
tmp[k++] = q[j++];
}
}
while (i<=mid){
tmp[k++] = q[i++];
}
while (j<=r){
tmp[k++] = q[j++];
}
for (i = l,j=0;i<=r;i++,j++){
q[i] = tmp[j];
}
}
//测试
public static void main(String[] args) {
int[] nums = {3,2,1,5,6,4};
MergeSort sort = new MergeSort();
sort.merge_sort(nums,0,nums.length-1);
for (int i =0;i<nums.length;i++){
System.out.print(nums[i]+",");
}
}
}