一些原理解释请参看:http://blog.csdn.net/waiwai4701/article/details/41314757,代码都是c++写的
自己整理了下一些算法的java实现,参考别人的也写不出来的以后等自己研究出来了再补上,这篇文章写的都是能运行出结果的。
1,插入排序
public static void insert_sort2(int[] array){
for(int i=1;i<array.length;i++){
int j=i-1;
int temp = array[i];
while(j>=0&&temp<array[j]){
System.out.println("i="+i+",j="+j);
System.out.println("array[i]="+array[i]+",array[j]="+array[j]+",array[j+1]="+array[j+1]);
array[j+1] = array[j];
j--;
}
array[j+1] = temp;
}
for(int i=0;i<array.length;i++){
System.out.println(array[i]);
}
}
2,二分插入排序
public static void binInsert_sort(int [] a){
int key,left,right ,middle;
for(int i=0;i<a.length;i++){
key = a[i];
left = 0;
right = i-1;
while(left <= right){
middle = (left+right)/2;
if(a[middle] >key)
right = middle -1;
else
left = middle +1;
}
for(int j=i-1;j>=left;j--){
a[j+1] = a[j];
}
a[left] = key;
}
for(int i=0;i<a.length;i++){
System.out.println(a[i]);
}
}
3,希尔排序
public static void hill_sort(int [] a){
System.out.println("排序之前:");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + "");
}
int d = a.length;
while (true) {
d = d / 2;
for (int x = 0; x < d; x++) {
for (int i = x + d; i < a.length; i = i + d) {
int temp = a[i];
int j;
for (j = i - d; j >= 0 && a[j] > temp; j = j - d) {
a[j + d] = a[j];
}
a[j + d] = temp;
}
}
if (d == 1) {
break;
}
}
System.out.println();
System.out.println("排序之后:");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + "");
}
}
4,选择排序
public static void select_sort(int [] a){
int min =0;
for(int i=0;i<a.length-1;i++){
min = i;
for(int j=i+1;j<a.length;j++){
if(a[i] >a[j]){
min = j;//查找到最小值
}
}
//交换
if(min != i){
int t = a[min];
a[min] = a[i];
a[i] = t;
}
}
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + "");
}
}
5,冒泡排序
public static void bubble_sort(int[] a){
for(int i=0;i<a.length-1;i++){
for(int j=i+1;j<a.length;j++){
if(a[i] >a[j]){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + "");
}
}
6,鸡尾酒排序
public static void cocktail_sortByMe(int a[]){
int head = 0;int tail = a.length-1;
while(true){
for(int i = head;i <tail;i++){
if(a[i]>a[i+1]){
int temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
}
}
tail --;
if(head == tail) break;
for(int j=tail;j>head;j--){
if(a[j]<a[j-1]){
int temp = a[j];
a[j] = a[j-1];
a[j-1] = temp;
}
}
head++;
if(head == tail) break;
}
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + "");
}
}
7,快速排序
public static void quick_sort2(int a[],int left,int right){
if(left >= right) return;
int pivot = a[left];
int i = left+1;
int j = right;
while(true){
while(i<right &&a[i]<pivot) i++;
while(j>left &&a[j]>pivot) j--;
if(i<j){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}else break;
}
int temp2 = a[left];
a[left] = a[j];
a[j] = temp2;
quick_sort2(a,left,j-1);
quick_sort2(a,j+1,right);
for (int k = 0; k < a.length; k++) {
System.out.print(a[k] + "");
}
System.out.println();
}
8,归并排序
public static void mergeSort(int []a,int left,int right){
if(left >= right) return;
int center = (left + right)/2;
mergeSort(a,left,center);
mergeSort(a,center+1,right);
merge(a,left,center,right);
for(int i=0;i<a.length;i++) {
System.out.print(a[i]);
}
System.out.println();
}
public static void merge(int[] a,int left,int center,int right){
int[] temArr = new int[a.length];//用来存放比较完成的小数组
int mid = center+1;//小数组的中间+1
int third = left;//用来标记temArr的指针位置
int tmp = left;//用来将小数组的值写进大数组
while(left<=center &&mid<=right){
if(a[left]<=a[mid]) temArr[third++]=a[left++];
else temArr[third++] =a[mid++];
}
if(mid <=right)
temArr[third++] = a[mid++];
if(left <=center)
temArr[third++] = a[left++];
while(tmp <= right)
a[tmp] = temArr[tmp++];
}