62,614
社区成员
发帖
与我相关
我的任务
分享
package sort;
import java.util.Arrays;
import java.util.Map;
import java.util.Random;
import java.util.TreeMap;
/**
* CSDN 排序竞赛
* @version 2008-06-24 07:31
*/
class TestSort {
static int MAX = 1000000; // 最大数据量
static int[] nums = new int[MAX]; // 特意移到类一级,免得他们需要时没有这个
static Map<Long, String> map = new TreeMap<Long, String>(); // 排序的结果,纳秒为单位了。
static long seed = 20080623;
private static void init() {
Random r = new Random(seed);
for (int i = 0; i < MAX; i++) {
nums[i] = r.nextInt(MAX);
}
}
private static String showResult() { // 这里随便选了几个进行排序结果的测试
return nums[1] + " " + nums[1234] + " " + nums[23456] + " " + nums[67890] + " " + nums[MAX - 1];
}
public static void main(String[] args) {
Random ran = new Random();
for (int i = 1; i <= 1; i++) { // 此处定义循环测试的次数
seed = ran.nextInt(999999999);
test();
}
for (String str : map.values()) {
System.out.print(str);
}
}
public static void test() {
long begin;
long end;
//
// 测试代码框架开始
init();
begin = System.nanoTime();
sort_JDK(nums);
end = System.nanoTime();
map.put((end - begin), String.format("%20s%15d %s\r\n", "sort_JDK=", (end - begin), showResult()));
// 测试代码框架结束
// 其它的测试代码将按照顺序逐个放到后面进行测试。
// 某些方法没有使用我提供的标准调用,造成我手工修改,引起不必要的问题。
// 请大家查看我测试的完整代码,并根据你的需求进行完善与修改。
}
public static int[] sort_JDK(int[] nums) {
Arrays.sort(nums);
return nums;
}
}
import java.util.Random;
class T {
public static void main(String[] args) {
int MAX = 100000;
int[] nums = new int[MAX];
Random r = new Random(20080623);
for (int i = 0; i < MAX; i++) {
nums[i] = r.nextInt(MAX);
}
long begin = System.currentTimeMillis();
sort(nums);
long end = System.currentTimeMillis();
System.out.println((end - begin)); // 以这个时间为标准,越小越好。
}
public static int[] sort(int[] nums) {
// 您的排序代码放在这里啦
int[] t=new int[20080623];
for(int i:nums){
t[i]++;
}
int index=0;
for(int z=0;z<t.length;z++){
if(t[z]!=0){
int b=t[z];
while(b>0){
nums[index++]=z;
b--;
}
}
}
return nums;
}
}
package selfimpr.datastruct.highsort;
public class QuickSort {
public static int copyCount = 0;
public static int compareCount = 0;
public static void sort(long[] array) {
sort(array, 0, array.length-1);
}
public static void sort(long[] array, int left, int right) {
if(right - left <= 0) return ;
long division = array[right];
int partitionIndex = partition(array, division, left, right);
sort(array, left, partitionIndex - 1);
sort(array, partitionIndex + 1, right);
}
public static void optimizeSort(long[] array, int left, int right) {
if(right - left <= 0) return ;
compareCount ++;
long division = (array[left] + array[right] + array[(left+right)/2])/3;
int partitionIndex = partition(array, division, left, right);
sort(array, left, partitionIndex - 1);
sort(array, partitionIndex + 1, right);
}
public static int partition(long[] array, long division, int left, int right) {
int leftPointer = left-1;
int rightPointer = right;
while(true) {
while(array[++leftPointer] < division) {
compareCount ++;
}
while(rightPointer > left && array[--rightPointer] > division) {
compareCount ++;
}
if(leftPointer < rightPointer) {
swap(array, leftPointer, rightPointer);
} else {
break;
}
}
swap(array, leftPointer, right);
return leftPointer;
}
private static void swap(long[] array, int leftPointer, int rightPointer) {
long temp = array[leftPointer];
array[leftPointer] = array[rightPointer];
array[rightPointer] = temp;
copyCount += 3;
}
}
public static int[] sort_sagezk2(int[] nums) {
final int LEN = nums.length;
int i, j, t, p;
int[] temp = new int[LEN];
for (i = 0; i < LEN;) {
temp[nums[i++]]++;
}
for (i = 0, p = 0; i < LEN; ++i) {
if ((t = temp[i]) == 0)
continue;
for (j = 0; j < t; ++j) {
nums[p++] = i;
}
}
return nums;
}
...
final int LEN = nums.length;
...
int[] temp = new int[LEN];
...
temp[nums[i++]]++; //这里有点危险