排序算法代码实现

package cn.hanyuweb.test;


import java.util.Arrays;


public class PaiXu {


public static void main(String[] args) {
int[] arr = { 7, 0, 33, 4, 7, 2, 6, 5, 33, 23, 2, 3, 8, 9, 1, 0, 4, 7, 2, 6, 5, 3, 8, 9, 23, 22, 15, 1, 7 };
System.out.println("原数组数据:" + Arrays.toString(arr));
pai6(arr, arr.length);
System.out.println("排序后数组数据:" + Arrays.toString(arr));
}


// 归并排序
public static boolean pai6(int a[], int n) {
int[] p = new int[n];
if (p == null)
return false;
mergesort(a, 0, n - 1, p);
return true;
}


// 递归拆分
public static void mergesort(int a[], int first, int last, int temp[]) {
if (first < last) {
int mid = (first + last) / 2;
mergesort(a, first, mid, temp); // 左边有序
mergesort(a, mid + 1, last, temp); // 右边有序
mergearray(a, first, mid, last, temp); // 再将二个有序数列合并
}
}


// 将有二个有序数列a[first...mid]和a[mid...last]合并。
public static void mergearray(int a[], int first, int mid, int last, int temp[]) {
int i = first, j = mid + 1;
int m = mid, n = last;
int k = 0;


while (i <= m && j <= n) {
if (a[i] <= a[j])
temp[k++] = a[i++];
else
temp[k++] = a[j++];
}


while (i <= m)
temp[k++] = a[i++];


while (j <= n)
temp[k++] = a[j++];


for (i = 0; i < k; i++)
a[first + i] = temp[i];
}


// 希尔排序
public static void pai5(int[] arr) {
// 增量gap,并逐步缩小增量
for (int gap = arr.length / 2; gap > 0; gap /= 2) {
// 从第gap个元素,逐个对其所在组进行直接插入排序操作
for (int i = gap; i < arr.length; i++) {
int j = i;
while (j - gap >= 0 && arr[j] < arr[j - gap]) {
// 插入排序采用交换法
change(arr, j, j - gap);
j -= gap;
}
}
}
}


// 快速排序
public static void pai4(int[] arr) {
int begin = 0;
int end = arr.length - 1;
paixu(arr, begin, end);
System.out.println(begin);
System.out.println("第一次扫描后" + Arrays.toString(arr));
}


public static void paixu(int[] arr, int begin, int end) {
if (begin >= end) {
return;
} else {
int inner = arr[begin];
int temp = chaifen(arr, begin, end, inner);
paixu(arr, begin, temp - 1);
paixu(arr, temp + 1, end);
}
}


public static int chaifen(int[] arr, int begin, int end, int inner) {
int left = begin;
int right = end + 1;
while (true) {
while (arr[++left] < inner)
;
while (end > 0 && arr[--right] > inner)
;
if (left >= right) {
break;
} else {
change(arr, left, right);
}
}
change(arr, begin, right);
return right;
}


// 插入排序
public static void pai3(int[] arr) {
int i, j;
for (i = 1; i < arr.length; i++) {
j = i - 1;
while (j >= 0 && arr[j] > arr[j + 1]) {
change(arr, j, j + 1);
j--;
}
}
}


// 选择排序
public static void pai2(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[i]) {
change(arr, i, j);
}
}
}
}


// 冒泡排序
public static void pai1(int[] arr) {


for (int i = 1; i < arr.length; i++) {
for (int j = 0; j < arr.length - i; j++) {
if (arr[j] > arr[j + 1]) {
change(arr, j, j + 1);
}
}
}
}


public static void change(int[] arr, int begin, int end) {
// arr[begin] = arr[begin] + arr[end];
// arr[end] = arr[begin] - arr[end];
// arr[begin] = arr[begin] - arr[end];
int temp = arr[begin];
arr[begin] = arr[end];
arr[end] = temp;
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值