|
Posted on 2005-12-05 20:24 勇敢的心 阅读(603) 评论(0) 编辑 收藏 所属分类: Java
/*这个程序是我在一个帖子上看到的,觉得写的十分的不错,拿出来与大家共享下*/ package com.cucu.test;
public class Sort {
public void swap(int a[], int i, int j) { int tmp = a[i]; a[i] = a[j]; a[j] = tmp; }
public int partition(int a[], int low, int high) { int pivot, p_pos, i; p_pos = low; pivot = a[p_pos]; for (i = low + 1; i <= high; i++) { if (a[i] > pivot) { p_pos++; swap(a, p_pos, i); } } swap(a, low, p_pos); return p_pos; }
public void quicksort(int a[], int low, int high) { int pivot; if (low < high) { pivot = partition(a, low, high); quicksort(a, low, pivot - 1); quicksort(a, pivot + 1, high); }
}
public static void main(String args[]) { int vec[] = new int[] { 37, 47, 23, -5, 19, 56 }; int temp; //选择排序法(Selection Sort) long begin = System.currentTimeMillis(); for (int k = 0; k < 1000000; k++) { for (int i = 0; i < vec.length; i++) { for (int j = i; j < vec.length; j++) { if (vec[j] > vec[i]) { temp = vec[i]; vec[i] = vec[j]; vec[j] = temp; } }
} } long end = System.currentTimeMillis(); System.out.println("选择法用时为:" + (end - begin)); //打印排序好的结果 for (int i = 0; i < vec.length; i++) { System.out.println(vec[i]); } // 冒泡排序法(Bubble Sort) begin = System.currentTimeMillis(); for (int k = 0; k < 1000000; k++) { for (int i = 0; i < vec.length; i++) { for (int j = i; j < vec.length - 1; j++) { if (vec[j + 1] > vec[j]) { temp = vec[j + 1]; vec[j + 1] = vec[j]; vec[j] = temp; } }
} } end = System.currentTimeMillis(); System.out.println("冒泡法用时为:" + (end - begin)); //打印排序好的结果 for (int i = 0; i < vec.length; i++) { System.out.println(vec[i]); }
//插入排序法(Insertion Sort) begin = System.currentTimeMillis(); for (int k = 0; k < 1000000; k++) { for (int i = 1; i < vec.length; i++) { int j = i; while (vec[j - 1] < vec[i]) { vec[j] = vec[j - 1]; j--; if (j <= 0) { break; } } vec[j] = vec[i]; } } end = System.currentTimeMillis(); System.out.println("插入法用时为:" + (end - begin)); //打印排序好的结果 for (int i = 0; i < vec.length; i++) { System.out.println(vec[i]); }
//快速排序法(Quick Sort)
Sort s = new Sort(); begin = System.currentTimeMillis(); for (int k = 0; k < 1000000; k++) { s.quicksort(vec, 0, 5); } end = System.currentTimeMillis(); System.out.println("快速法用时为:" + (end - begin)); //打印排序好的结果 for (int i = 0; i < vec.length; i++) { System.out.println(vec[i]); } }
} ************************************************************************************
- package org.jr.util;
- /**
- * Copyright: Copyright (c) 2002-2004
- * Company: JavaResearch(http://www.javaresearch.org)
- * 最后更新日期:2003年3月4日
- * @author Cherami
- */
- import org.jr.*;
- /**
- * 排序工具类,提供常见的需要排序但是又没有实现Comparable接口的类。
- * 此类也提供一些创建的排序算法的范例。
- * @since 0.5
- */
- public class CompareUtil {
- /**
- * 私有构造方法,防止类的实例化,因为工具类不需要实例化。
- */
- private CompareUtil() {
- }
- /**
- * 比较两个数字。
- * 这个方法取Number的double值进行比较,因此只有在两个数严格相等的情况下才返回0,
- * 又可能因为Java中Double型和Float的精度不同而导致两个相等的数不返回0。
- * @param o1 第一个数字
- * @param o2 第二个数字
- * @return 第一个数字大于第二个返回1,等于返回0,否则返回-1
- * @since 0.5
- */
- public static int compare(Number o1, Number o2) {
- double n1 = o1.doubleValue();
- double n2 = o2.doubleValue();
- if (n1 < n2) {
- return -1;
- }
- else if (n1 > n2) {
- return 1;
- }
- else {
- return 0;
- }
- }
- /**
- * 比较两个布尔型值。
- * 如果两个的值不同,true被认为等于1,而false等于0。
- * @param o1 第一个值
- * @param o2 第二个值
- * @return 第一个值大于第二个返回1,等于返回0,否则返回-1
- * @since 0.5
- */
- public static int compare(Boolean o1, Boolean o2) {
- boolean b1 = o1.booleanValue();
- boolean b2 = o2.booleanValue();
- if (b1 == b2) {
- return 0;
- }
- else if (b1) {
- return 1;
- }
- else {
- return -1;
- }
- }
- /**
- * 冒泡排序法排序。
- * @param objects 排序对象
- * @param isAscent 排序顺序
- * @return 排序后应该有的索引数组
- * @since 0.5
- */
- public static int[] n2sort(Comparable[] objects, boolean isAscent) {
- int length = objects.length;
- int[] indexes = ArrayUtil.getInitedIntArray(length);
- for (int i = 0; i < length; i++) {
- for (int j = i + 1; j < length; j++) {
- if (isAscent == true) {
- if (objects[indexes[i]].compareTo(objects[indexes[j]]) > 0) {
- swap(indexes, i, j);
- }
- }
- else {
- if (objects[indexes[i]].compareTo(objects[indexes[j]]) < 0) {
- swap(indexes, i, j);
- }
- }
- }
- }
- return indexes;
- }
- /**
- * 冒泡排序法排序。
- * @param objects 排序对象
- * @param key 排序关键字
- * @param isAscent 排序顺序
- * @return 排序后应该有的索引数组
- * @since 0.5
- */
- public static int[] n2sort(PropertyComparable[] objects, int key,
- boolean isAscent) {
- int length = objects.length;
- int[] indexes = ArrayUtil.getInitedIntArray(length);
- for (int i = 0; i < length; i++) {
- for (int j = i + 1; j < length; j++) {
- if (isAscent == true) {
- if (objects[indexes[i]].compareTo(objects[indexes[j]], key) > 0) {
- swap(indexes, i, j);
- }
- }
- else {
- if (objects[indexes[i]].compareTo(objects[indexes[j]], key) < 0) {
- swap(indexes, i, j);
- }
- }
- }
- }
- return indexes;
- }
- /**
- * 冒泡排序法排序。
- * @param objects 排序对象
- * @return 按照升序排序后应该有的索引数组
- * @since 0.6
- */
- public static int[] n2sort(Comparable[] objects) {
- return n2sort(objects,true);
- }
- /**
- * 冒泡排序法排序。
- * @param objects 排序对象
- * @param key 排序关键字
- * @return 按照升序排序后应该有的索引数组
- * @since 0.6
- */
- public static int[] n2sort(PropertyComparable[] objects, int key) {
- return n2sort(objects,key);
- }
- /**
- * 插入排序法排序。
- * @param objects 排序对象
- * @return 按照升序排序后应该有的索引数组
- * @since 0.6
- */
- public static int[] insertionSort(Comparable[] objects) {
- int length = objects.length;
- int[] indexes = ArrayUtil.getInitedIntArray(length);
- for (int i = 1; i < length; i++) {
- int j = i;
- Comparable B = objects[indexes[i]];
- while ((j > 0) && (objects[indexes[j-1]].compareTo(B) > 0)) {
- indexes[j] = indexes[j-1];
- j--;
- }
- indexes[j] = i;
- }
- return indexes;
- }
- /**
- * 插入排序法排序。
- * @param objects 排序对象
- * @param key 排序关键字
- * @return 按照升序排序后应该有的索引数组
- * @since 0.6
- */
- public static int[] insertionSort(PropertyComparable[] objects, int key) {
- int length = objects.length;
- int[] indexes = ArrayUtil.getInitedIntArray(length);
- for (int i = 1; i < length; i++) {
- int j = i;
- Comparable B = objects[indexes[i]];
- while ((j > 0) && (objects[indexes[j-1]].compareTo(B,key) > 0)) {
- indexes[j] = indexes[j-1];
- j--;
- }
- indexes[j] = i;
- }
- return indexes;
- }
- /**
- * 选择排序法排序。
- * @param objects 排序对象
- * @return 按照升序排序后应该有的索引数组
- * @since 0.6
- */
- public static int[] selectionSort(Comparable[] objects) {
- int length = objects.length;
- int[] indexes = ArrayUtil.getInitedIntArray(length);
- for (int i = 0; i < length; i++) {
- int min = i;
- int j;
- //在未排序列表里面查找最小元素
- for (j = i + 1; j < length; j++) {
- if (objects[indexes[j]].compareTo(objects[indexes[min]]) <0 ) {
- min = j;
- }
- }
- //将最小的元素交换到未排序元素的最开始
- swap(indexes,i,min);
- }
- return indexes;
- }
- /**
- * 选择排序法排序。
- * @param objects 排序对象
- * @param key 排序关键字
- * @return 按照升序排序后应该有的索引数组
- * @since 0.6
- */
- public static int[] selectionSort(PropertyComparable[] objects, int key) {
- int length = objects.length;
- int[] indexes = ArrayUtil.getInitedIntArray(length);
- for (int i = 0; i < length; i++) {
- int min = i;
- int j;
- //在未排序列表里面查找最小元素
- for (j = i + 1; j < length; j++) {
- if (objects[indexes[j]].compareTo(objects[indexes[min]],key) <0 ) {
- min = j;
- }
- }
- //将最小的元素交换到未排序元素的最开始
- swap(indexes,i,min);
- }
- return indexes;
- }
- /**
- * 双向冒泡排序法排序。
- * @param objects 排序对象
- * @return 按照升序排序后应该有的索引数组
- * @since 0.6
- */
- public static int[] bidirectionalBubbleSort(Comparable[] objects) {
- int length = objects.length;
- int[] indexes = ArrayUtil.getInitedIntArray(length);
- int j;
- int limit = objects.length;
- int start = -1;
- while (start < limit) {
- start++;
- limit--;
- for (j = start; j < limit; j++) {
- if (objects[indexes[j]].compareTo(objects[indexes[j+1]]) > 0) {
- swap(indexes,j,j+1);
- }
- }
- for (j = limit; --j >= start;) {
- if (objects[indexes[j]].compareTo(objects[indexes[j+1]]) > 0) {
- swap(indexes,j,j+1);
- }
- }
- }
- return indexes;
- }
- /**
- * 双向冒泡排序法排序。
- * @param objects 排序对象
- * @param key 排序关键字
- * @return 按照升序排序后应该有的索引数组
- * @since 0.6
- */
- public static int[] bidirectionalBubbleSort(PropertyComparable[] objects, int key) {
- int length = objects.length;
- int[] indexes = ArrayUtil.getInitedIntArray(length);
- int j;
- int limit = objects.length;
- int start = -1;
- while (start < limit) {
- start++;
- limit--;
- for (j = start; j < limit; j++) {
- if (objects[indexes[j]].compareTo(objects[indexes[j+1]]) > 0) {
- swap(indexes,j,j+1);
- }
- }
- for (j = limit; --j >= start;) {
- if (objects[indexes[j]].compareTo(objects[indexes[j+1]],key) > 0) {
- swap(indexes,j,j+1);
- }
- }
- }
- return indexes;
- }
- /**
- * 交换两个元素的值。
- * @param indexes 原索引数组
- * @param i 第一行
- * @param j 第二行
- */
- private static void swap(int[] indexes, int i, int j) {
- int tmp = indexes[i];
- indexes[i] = indexes[j];
- indexes[j] = tmp;
- }
- }
- ------------------------------------------
-
- 冒泡排序:
-
1、比较相邻的两个元素,如果后面的比前面小,就对调二者。反复比较,到最后两个元素。结果,最大值就跑到了最末位置。
-
2、反复第一步,直到所有较大值都跑到靠后的位置。
-
---------------------------------------------
-
选择排序
-
1、一开始整个数列是未排列的
-
2、从未排列的数中,挑选出最小的数,和未排列的数中的第一个元素互调,并将该最小的数归类到已排序的序列中;
-
3、重复第2步,直到所有的数都归类到已排序数列中。
-
---------------------------------------------
-
插入排序法:
-
1、一开始只有第一个数在已排序数列中,其他的数归类到未排序数列中;
-
2、将未排序的第一个数,插入到已排序数列中,使得插入后的已排序数列仍然维持由小到大的顺序;
-
3、重复步骤2,直到所有的数都在已排序数列中。
-
-----------------------------------------------
|