快速排序
简单思路可以理解为,运用一趟排序,将数组分为独立的两个部分,其中一个部分的所有元素都比另一个部分的所有元素小(每一部分中的元素不需要区分大小),再运用递归的思想继续分别排序两个部分,以此类推,直到排完所有元素。
我之前用c++实现过,这次用java重现一下,在实现的过程中。发现了一些问题。
import java.util.*;
import java.io.*;
public class QuickSort {
static void swap ( int [] data, int a, int b) {
int t = data [a];
data[a] = data[b];
data[b] = t;
}
static void quicksort(int q[], int l, int r){
if(l >= r) return;
int x = q[(l+r)/2], i = l - 1 , j = r + 1;
while(i < j){
do i++; while(q[i] < x);
do j--; while(q[j] > x);
if(i < j) swap(q,i,j);
}
quicksort( q, l, j);
quicksort( q, j+1, r);
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数字:");
int n = sc.nextInt();
int q[] = new int[n];
for(int i = 0; i < n; i ++){
q[i] = sc.nextInt();
}
quicksort( q, 0, n-1);
for(int i = 0; i < n; i ++){
System.out.print(q[i] + " ");
}
}
}
因为java没有内置的swap()函数,所以需要自己写一个交换方法,而且java没有指针的概念,不能实现传地址,所以像这种普通的交换方法,不能实现数组的里面的两个位置的数字的交换。
错误方法:
static void swap(int q, int p){
int temp;
temp = q;
q = p;
p = temp;
}
正确方法:
static void swap ( int [] data, int a, int b) {
int t = data [a];
data[a] = data[b];
data[b] = t;
}