import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Created by Root on 2014/12/12.
*/
/*
* java排序法
*/
public class Sort {
private static int[] array = { 51, 21, 30, 4, 15, 36, 17, 68, 29 };
/**
* 快速排序
* 利用Arrays带有的排序方法快速排序
*/
public static int[] quickSort(){
Arrays.sort(array); //进行排序
return array;
}
/**
* 冒泡排序法
* @param
*/
public static int[] bubbleSort(){
for(int i = 0;i < array.length - 1;i++){
for(int j = i + 1;j < array.length;j++){
if(array[i] > array[j]){
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
return array;
}
/**
* 直接插入法排序
* @param
*/
public static void insertSort() {
//直接插入排序
for (int i = 1; i < array.length; i++) {
//待插入元素
int temp = array[i];
int j;
for (j = i-1; j >= 0; j--) {
//将大于temp的往后移动一位
if(array[j] > temp){
array[j+1] = array[j];
}else{
break;
}
}
array[j+1] = temp;
}
}
/**
* 二分插入法
* @param
*/
private static void sort2() {
for (int i = 0; i < array.length; i++) {
int temp = array[i];
int left = 0;
int right = i - 1;
int mid = 0;
while (left <= right) {
mid = (left + right) / 2;
if (temp < array[mid]) {
right = mid - 1;
} else {
left = mid + 1;
}
}
for (int j = i - 1; j >= left; j--) {
array[j + 1] = array[j];
}
if (left != i) {
array[left] = temp;
}
}
}
/**
* 希尔排序
* @param
*/
public static void xeSort(){
//希尔排序
int d = array.length;
while(true){
d = d / 2;
for(int x=0;x<d;x++){
for(int i=x+d;i<array.length;i=i+d){
int temp = array[i];
int j;
for(j=i-d;j >= 0 && array[j]>temp;j=j-d){
array[j+d] = array[j];
}
array[j+d] = temp;
}
}
if(d == 1){
break;
}
}
}
/**
* 简单的选择排序
* @param
*/
public static void jdSort(){
for (int i = 0; i < array.length; i++) {
int min = array[i];
int n=i; //最小数的索引
for(int j = i+1;j < array.length;j++){
if(array[j] < min){ //找出最小的数
min = array[j];
n = j;
}
}
array[n] = array[i];
array[i] = min;
}
}
/**
* 归并排序
* @param a
* @param left
* @param right
*/
public static void mergeSort(int[] a, int left, int right) {
if(left<right){
int middle = (left+right)/2;
//对左边进行递归
mergeSort(a, left, middle);
//对右边进行递归
mergeSort(a, middle+1, right);
//合并
merge(a,left,middle,right);
}
}
private static void merge(int[] a, int left, int middle, int right) {
int[] tmpArr = new int[a.length];
int mid = middle + 1; //右边的起始位置
int tmp = left;
int third = left; //Sort s = new Sort();
while (left <= middle && mid <= right) { //quickSort();//快速排序
//从两个数组中选取较小的数放入中间数组 //bubbleSort();//冒泡排序
if (a[left] <= a[mid]) { //insertSort();//直接插入法
tmpArr[third++] = a[left++]; //sort2();//二分法插入
} else { //xeSort();//希耳排序法
tmpArr[third++] = a[mid++];
jdSort();//简单排序
}
}
//将剩余的部分放入中间数组
while (left <= middle) {
tmpArr[third++] = a[left++];
}
while (mid <= right) {
tmpArr[third++] = a[mid++];
}
//将中间数组复制回原数组
while (tmp <= right) {
a[tmp] = tmpArr[tmp++];
}
}
/**
* 基数排序
* @param
*/
public static void jsSort(int[] array) {
//找到最大数,确定要排序几趟
int max = 0;
for (int i = 0; i < array.length; i++) {
if(max<array[i]){
max = array[i];
}
}
//判断位数
int times = 0;
while(max>0){
max = max/10;
times++;
}
//建立十个队列
List<ArrayList> queue = new ArrayList<ArrayList>();
for (int i = 0; i < 10; i++) {
ArrayList queue1 = new ArrayList();
queue.add(queue1);
}
//进行times次分配和收集
for (int i = 0; i < times; i++) {
//分配
for (int j = 0; j < array.length; j++) {
int x = array[j]%(int)Math.pow(10, i+1)/(int)Math.pow(10, i);
ArrayList queue2 = queue.get(x);
queue2.add(array[j]);
queue.set(x,queue2);
}
//收集
int count = 0;
for (int j = 0; j < 10; j++) {
while(queue.get(j).size()>0){
ArrayList<Integer> queue3 = queue.get(j);
array[count] = queue3.get(0);
queue3.remove(0);
count++;
}
}
}
}
public static void main(String[] args){
//Sort s = new Sort();
//quickSort();//快速排序
//bubbleSort();//冒泡排序
//insertSort();//直接插入法
//sort2();//二分法插入
//xeSort();//希耳排序法
//jdSort();//简单排序
//mergeSort(array,0,array.length - 1);//归并排序
jsSort(array);//基数排序
//循环排序后的数组
for(int i=0;i<array.length;i++){
System.out.print(array[i] + ",");
}
}
}
import java.util.Arrays;
import java.util.List;
/**
* Created by Root on 2014/12/12.
*/
/*
* java排序法
*/
public class Sort {
private static int[] array = { 51, 21, 30, 4, 15, 36, 17, 68, 29 };
/**
* 快速排序
* 利用Arrays带有的排序方法快速排序
*/
public static int[] quickSort(){
Arrays.sort(array); //进行排序
return array;
}
/**
* 冒泡排序法
* @param
*/
public static int[] bubbleSort(){
for(int i = 0;i < array.length - 1;i++){
for(int j = i + 1;j < array.length;j++){
if(array[i] > array[j]){
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
return array;
}
/**
* 直接插入法排序
* @param
*/
public static void insertSort() {
//直接插入排序
for (int i = 1; i < array.length; i++) {
//待插入元素
int temp = array[i];
int j;
for (j = i-1; j >= 0; j--) {
//将大于temp的往后移动一位
if(array[j] > temp){
array[j+1] = array[j];
}else{
break;
}
}
array[j+1] = temp;
}
}
/**
* 二分插入法
* @param
*/
private static void sort2() {
for (int i = 0; i < array.length; i++) {
int temp = array[i];
int left = 0;
int right = i - 1;
int mid = 0;
while (left <= right) {
mid = (left + right) / 2;
if (temp < array[mid]) {
right = mid - 1;
} else {
left = mid + 1;
}
}
for (int j = i - 1; j >= left; j--) {
array[j + 1] = array[j];
}
if (left != i) {
array[left] = temp;
}
}
}
/**
* 希尔排序
* @param
*/
public static void xeSort(){
//希尔排序
int d = array.length;
while(true){
d = d / 2;
for(int x=0;x<d;x++){
for(int i=x+d;i<array.length;i=i+d){
int temp = array[i];
int j;
for(j=i-d;j >= 0 && array[j]>temp;j=j-d){
array[j+d] = array[j];
}
array[j+d] = temp;
}
}
if(d == 1){
break;
}
}
}
/**
* 简单的选择排序
* @param
*/
public static void jdSort(){
for (int i = 0; i < array.length; i++) {
int min = array[i];
int n=i; //最小数的索引
for(int j = i+1;j < array.length;j++){
if(array[j] < min){ //找出最小的数
min = array[j];
n = j;
}
}
array[n] = array[i];
array[i] = min;
}
}
/**
* 归并排序
* @param a
* @param left
* @param right
*/
public static void mergeSort(int[] a, int left, int right) {
if(left<right){
int middle = (left+right)/2;
//对左边进行递归
mergeSort(a, left, middle);
//对右边进行递归
mergeSort(a, middle+1, right);
//合并
merge(a,left,middle,right);
}
}
private static void merge(int[] a, int left, int middle, int right) {
int[] tmpArr = new int[a.length];
int mid = middle + 1; //右边的起始位置
int tmp = left;
int third = left; //Sort s = new Sort();
while (left <= middle && mid <= right) { //quickSort();//快速排序
//从两个数组中选取较小的数放入中间数组 //bubbleSort();//冒泡排序
if (a[left] <= a[mid]) { //insertSort();//直接插入法
tmpArr[third++] = a[left++]; //sort2();//二分法插入
} else { //xeSort();//希耳排序法
tmpArr[third++] = a[mid++];
jdSort();//简单排序
}
}
//将剩余的部分放入中间数组
while (left <= middle) {
tmpArr[third++] = a[left++];
}
while (mid <= right) {
tmpArr[third++] = a[mid++];
}
//将中间数组复制回原数组
while (tmp <= right) {
a[tmp] = tmpArr[tmp++];
}
}
/**
* 基数排序
* @param
*/
public static void jsSort(int[] array) {
//找到最大数,确定要排序几趟
int max = 0;
for (int i = 0; i < array.length; i++) {
if(max<array[i]){
max = array[i];
}
}
//判断位数
int times = 0;
while(max>0){
max = max/10;
times++;
}
//建立十个队列
List<ArrayList> queue = new ArrayList<ArrayList>();
for (int i = 0; i < 10; i++) {
ArrayList queue1 = new ArrayList();
queue.add(queue1);
}
//进行times次分配和收集
for (int i = 0; i < times; i++) {
//分配
for (int j = 0; j < array.length; j++) {
int x = array[j]%(int)Math.pow(10, i+1)/(int)Math.pow(10, i);
ArrayList queue2 = queue.get(x);
queue2.add(array[j]);
queue.set(x,queue2);
}
//收集
int count = 0;
for (int j = 0; j < 10; j++) {
while(queue.get(j).size()>0){
ArrayList<Integer> queue3 = queue.get(j);
array[count] = queue3.get(0);
queue3.remove(0);
count++;
}
}
}
}
public static void main(String[] args){
//Sort s = new Sort();
//quickSort();//快速排序
//bubbleSort();//冒泡排序
//insertSort();//直接插入法
//sort2();//二分法插入
//xeSort();//希耳排序法
//jdSort();//简单排序
//mergeSort(array,0,array.length - 1);//归并排序
jsSort(array);//基数排序
//循环排序后的数组
for(int i=0;i<array.length;i++){
System.out.print(array[i] + ",");
}
}
}