用JAVA实现冒泡排序、选择排序、插入排序、快速排序和归并排序。封装在sort类中。
class Sort{
/* 辅助函数 */
//Java没有引用,利用数组来完成值的交换
void swap(int a[], int i, int j) {
int c = a[i];
a[i] = a[j];
a[j] = c;
}
//输出数组
void print(int a[]) {
for(int i: a) {
System.out.print(i + " ");
}
System.out.print("\n");
}
//----------------华丽分割线--------------------//
/* 5种排序算法的实现 */
//冒泡排序
public void Bubble_Sort(int a[], int n) {
for(int i = n - 2; i >= 0; i--) {
for(int j = 0; j <= i; j++) {
if(a[j] > a[j + 1])swap(a, j, j + 1);
}
}
}
//插入排序
public void Insert_Sort(int a[], int n) {
for(int i = 1; i < n; i++) {
if(a[i] < a[i - 1]) {
int temp = a[i], j = i - 1;
while(j >= 0 && a[j] > temp) {
a[j + 1] = a[j];
j--;
}
a[j + 1] = temp;
}
}
}
//选择排序
public void Selection_Sort(int a[], int n) {
for(int i = 0; i < n; i++) {
int min = a[i], min_index = i;
for(int j = i + 1; j < n; j++) {
if(a[j] < min) {
min = a[j];
min_index = j;
}
}
swap(a, i, min_index);
}
}
//快速排序
//参考 http://www.cnblogs.com/CBDoctor/p/4077574.html
public void Quick_Sort(int a[], int n) {
recursive(a, 0, n - 1);
}
void recursive(int a[], int left, int right) {
if(left > right)return ;
int x = a[left];
int i = left, j = right;
while(i != j) {
while(i < j && a[j] >= x)j--;
while(i < j && a[i] <= x)i++;
swap(a, i, j);
}
swap(a, left, i);
recursive(a, left, i - 1);
recursive(a, i + 1, right);
}
//归并排序
//参考 http://blog.youkuaiyun.com/morewindows/article/details/6678165
void Merge_Sort(int a[], int n) {
mergeSort(a, 0, n - 1);
}
void mergeSort(int a[], int left, int right) {
if(left < right) {
int mid = (left + right) / 2;
//先递归的给左右两个子数组排序
mergeSort(a, left, mid);
mergeSort(a, mid + 1, right);
//合并两个已经有序的数组
mergeArray(a, left, right, mid);
}
}
void mergeArray(int a[], int left, int right, int mid) {
int copy[] = new int[right - left + 1];
int i = left, j = mid + 1;
int limit_1 = mid + 1, limit_2 = right + 1;//两个数组的界限
int index = 0;
while(i < limit_1 && j < limit_2) {
if(a[i] < a[j]) copy[index++] = a[i++];
else copy[index++] = a[j++];
}
while(i < limit_1) copy[index++] = a[i++];
while(j < limit_2) copy[index++] = a[j++];
//把值赋给原来的数组
for(int k = 0; k < copy.length; k++)
a[left + k] = copy[k];
}
}
public class HelloWorld {
public static void main(String[] args) {
int a[] = {1, 1, 2, 2, 0, 6, 3, 2, 6};
Sort sort = new Sort();
sort.Merge_Sort(a, a.length);
sort.print(a);
}
}