归并排序;
1 //merge sort
2 public static void merge(int[] a,int aux[],int lo ,int mid,int hi ){
3 int i = lo;
4 int j = mid+1;
5 //copy a
6 for (int k = lo; k <= hi; k++)
7 aux[k] = a[k];
8 //merge
9 for(int k = lo;k<=hi;k++){
10 //先判断是否越界
11 if(i>mid) a[k]=aux[j++];
12 else if(j>hi) a[k]=aux[i++];
13 // merge
14 else if(aux[j]<=aux[i]) a[k]=aux[j++];
15 else a[k]=aux[i++];
16 }
17 }
18 public static void mergesort(int[] a,int aux[],int lo,int hi) {
19 //边界条件
20 if(lo>=hi) return ;
21 int mid = (hi-lo)/2+lo;
22 mergesort(a,aux, lo, mid);
23 mergesort(a,aux, mid+1, hi);
24 merge(a,aux, lo, mid, hi);
25
26 }
27 public static void mergeSort(int[] a){
28 int aux[] = new int[a.length];
29 mergesort(a,aux, 0, a.length-1);
30 }
1 ef merge(a,aux,lo,mid,hi):
2 if(lo>=hi) :
3 return a
4
5 ####merge之前copy
6 aux = a.copy()
7
8 i = lo
9 j = mid + 1
10 k = lo
11 while i<=mid and j<=hi:
12 if(aux[i]<aux[j]):
13 a[k] = aux[i];i+=1;k+=1
14 else:
15 a[k] = aux[j];j+=1;k+=1
16 while i<=mid:
17 a[k] = aux[i] ;i+=1;k+=1
18 while j<=hi:
19 a[k] = aux[j] ;j+=1;k+=1
20 return a
21 def merge_sort(a,aux,lo,hi):
22 if(lo>=hi):
23 return
24 mid = int((hi-lo)/2) +lo
25 print(a,aux,lo,mid,hi)
26 merge_sort(a,aux,lo,mid)
27 merge_sort(a,aux,mid+1,hi)
28 merge(a,aux,lo,mid,hi)
29 return a
30 def merge_sort1(a):
31 merge_sort(a,a.copy(),0,len(a)-1)
快速排序:
1 //quick sort
2 //partion
3 private static int partion(int[] a ,int lo,int hi) {
4 int v = a[lo];
5 int i = lo ,j=hi+1;
6 while(true){
7 while(a[++i]<v) if(i>=hi) break;
8 while(a[--j]>v) if(j<=lo) break;
9 if(i>=j) break;
10 swap(a, i, j);
11 }
12 swap(a, lo, j);
13 return j;
14 }
15 public static void partionsort(int[] a,int lo,int hi) {
16 if(lo>=hi) return;
17 int j = partion(a, lo, hi);
18 partionsort(a, lo, j);
19 partionsort(a, j+1, hi);
20
21 }
22 public static void partionSort(int[] a) {
23 partionsort(a, 0, a.length-1);
24 }
25
1 def quick_sort1(x):
2 def partion(a, lo, hi):
3 '''
4 得到数组a的划分
5 以a[lo] 为key,最后把a[lo]放在最终排序的位置
6 且 a[lo] 前面的比其都小,a[lo]后面的比其都大
7 '''
8 key = a[lo]
9 i = lo
10 j = hi
11 while(i < j):
12 # 必须带等号
13 while(i < hi and a[i] <= key): # 从左往右找到大于key的下标
14 i += 1
15 while(j > lo and a[j] >= key): # 从右往左找到小于key的下标
16 j -= 1
17 if i < j: # 如果下标i小于下标j则交换,没有越界
18 swap(a, i, j)
19 swap(a, lo, j)
20 return j
21
22 def quick_sort(x, lo, hi):
23 if lo >= hi:
24 return
25 i = partion(x, lo, hi)
26 print(x)
27 quick_sort(x, lo, i)
28 quick_sort(x, i + 1, hi)
29 print(x)
30
31 quick_sort(x, 0, len(x) - 1)
32 return x