计划花一个月时间刷刷数据结构与算法,先拿排序热热身吧。
import java.util.Random;
public class Sort {
/**
* 插入排序
* */
public void insertSort(int[]a,int len){
if(len<=0){
return;
}
for(int i=1;i<len;i++){
int temp = a[i];
int j = i-1;
while(j>=0 && a[j]>temp){
a[j+1] = a[j];
j--;
}
a[j+1] = temp;
}
}
/**
* 选择排序
* @param a
* @param n
*/
public void selectSort(int[] a,int n){
if(n<=0){
return;
}
for (int i = 0; i < n-1 ; i++) {
int m = i;
for(int j = i+1;j< n ;j++){
if(a[j] < a[m]){
m = j;
}
}
if(m!=i){
int t = a[i];
a[i] = a[m];
a[m] = t;
}
}
}
/**
* 冒泡排序
* @param a
* @param n
*/
public void bubbleSort(int[] a,int n){
if(n<=0)
return;
for(int i=0;i<n;i++){
for(int j=0;j<n-i-1;j++){
if(a[j]>a[j+1]){
int t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
}
/**
* 快速排序
* @param a
* @param n
*/
public void quickSort(int a[],int n){
int left = 0;
int right = n-1;
quickSort(a,left,right);
}
public void quickSort(int a[],int left,int right){
if(left>right)
return;
int index = partition(a,left,right);
quickSort(a,left,index-1);
quickSort(a,index+1,right);
}
public int partition(int a[],int left,int right){
int i = left,j = right;
int temp = a[i];
while(i<j){
while(i<j && a[j]>temp)
j--;
if(i<j)
a[i++] = a[j];
while(i<j && a[i]<temp)
i++;
if(i<j)
a[j--] = a[i];
}
a[i] = temp;
return i;
}
/**
* 二路归并排序
* @param a
* @param n
*/
public void mergeSort(int a[],int n){
int left = 0;
int right = n-1;
mergeSort(a,left,right);
}
public void mergeSort(int a[],int left,int right){
if(left>=right)
return;
int mid = (left + right)/2;
mergeSort(a,left,mid);
mergeSort(a,mid+1,right);
merge(a,left,right,mid);
}
public void merge(int a[],int left,int right,int mid){
int n = right-left+1;
int b[] = new int[n];
int i = left, j = mid+1;
int k = 0;
while(i<=mid && j<=right){
if(a[i]<a[j]){
b[k++] = a[i++];
}else{
b[k++] = a[j++];
}
}
while(i<=mid){
b[k++] = a[i++];
}
while (j<=right){
b[k++] = a[j++];
}
for (k = 0; k < n; k++) {
a[left+k] = b[k];
}
}
/**
* 堆排序(从小到大排序,建大根堆)
* @param a
* @param n
*/
public void heapSort(int a[],int n){
int right = n - 1;
buildHeap(a,right);
for(int i=right;i>=0;i--){
int temp = a[0];
a[0] = a[i];
a[i] = temp;
adjustHeap(a,0,i-1);
}
}
public void buildHeap(int a[],int n){
for(int i = n / 2;i >= 0;i--){
adjustHeap(a,i,n);
}
}
public void adjustHeap(int a[],int i,int n){
int temp = a[i],j;
for(j = 2*i;j < n;j *= 2){
if(j<n && a[j]<a[j+1]){
j++;
}
if(temp<a[j]){
a[i] = a[j];
i = j;
}
}
a[i] = temp;
}
/**
* 随机生成一个数组
* */
public int[] randomArray(int n,int left,int right){
int array[] = new int[n];
Random random = new Random();
int interval = right -left;
for(int i=0;i<n;i++){
int temp = random.nextInt(interval) + left;
array[i] = temp;
}
return array;
}
/**
* 输出数组中的值
* @param array
* @param n
*/
public void print(int[] array,int n){
for(int i=0;i<n;i++){
System.out.println(array[i]);
}
}
public static void main(String args[]){
Sort sort = new Sort();
int n = 10;
int[] array = sort.randomArray(n,0,50);
System.out.println("初始数组为:");
sort.print(array,n);
System.out.println("");
sort.insertSort(array,n);
sort.selectSort(array,n);
sort.bubbleSort(array,n);
sort.quickSort(array,n);
sort.mergeSort(array,n);
sort.heapSort(array,n);
sort.print(array,n);
}
}