4、快速排序
思想:其实上快排思路很简单。尤其是这种简单的数字排序,就是每次把第一个当做标兵;然后士兵A和士兵B分别从数组两端开始走,如果大于标兵则放在左边,小于2标兵则放在右端,一次递归,出来的就是排序好的数列了(和汉诺塔的思想是有点像的)
package Sort;
import java.util.Scanner;
public class quickSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
System.out.println("快速排序:");
System.out.println("请输入一个数组长度,可多次输入:");
while (sc.hasNextInt()) {
int n = sc.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
System.out.println("请输入第" + (i + 1) + "个数;");
arr[i] = sc.nextInt();
}
// 快速排序主题
quickSort sort = new quickSort();
sort.quickSort(arr, 0, n - 1);
System.out.println("输出排序后的数组:");
for (int j = 0; j < n; j++) {
System.out.print(arr[j] + " ");
}
System.out.println();
}
}
// 划分数组
int partion(int[] arr, int p, int r) {
int x = arr[r];
int i = p - 1;// 注意这点,把i设成负值,然后作为移动的标志
int j;
for (j = p; j < r; j++) {
if (arr[j] <= x) {
i++;
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
int temp = arr[j];
arr[j] = arr[i + 1];
arr[i + 1] = temp;
return i + 1;// 返回的应该是交换后的哨兵的位置
}
// 递归解决每个划分后的小数组
void quickSort(int[] arr, int p, int r) {
if (p < r) {
int q = partion(arr, p, r);
quickSort(arr, p, q - 1);
quickSort(arr, q + 1, r);
}
}
}
5、希尔排序
思想:输入一个数组,把这二个数组分成多个小的数组,进行排序,第一次取数组的二分之一t=length/2,然后就是a[t]和a[t-t]进行比较大小,依次增加,一直到a[length-1];第二部是t=t/2重复上一步的步骤,依次递推下去,知道t==1;输出的新数列就是排序好的数列了。
package Sort;
import java.util.Scanner;
public class shellSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
System.out.println("希尔排序:");
System.out.println("输入一个数组长度,可多次输入:");
while (sc.hasNextInt()) {
int n = sc.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
System.out.println("请输入第" + (i + 1) + "个数;");
arr[i] = sc.nextInt();
}
// 希尔排序主题
//调用shellSort函数
shellSort ss = new shellSort();
ss.shellsort(arr);
System.out.println("排序后:");
for (int k = 0; k < n; k++) {
System.out.print(arr[k] + " ");
}
System.out.println();
}
}
//shellSort函数
public void shellsort(int[] arr) {
int temp = 0;
int j = 0;
for (int t = arr.length / 2;t > 0; t /= 2) {
for (int i = t; i < arr.length; i++) {
temp = arr[i];
for (j = i; j >= t; j -= t) {
if (temp <arr[j - t]) {
arr[j] = arr[j - t];
} else {
break;
}
}
arr[j] = temp;
}
}
}
/**
* 6 5 2 3 1 4 0
*
*
*/
}