数据结构的东西忘了好多,要找新工作了,复习复习。
package com.test;
import java.util.Arrays;
import java.util.Date;
public class Sort{
public static void main(String[] args) {
// gerneraMethod("1", 2 , new Date());//做个泛型的案例给你看看就好
Integer[] A = new Integer[] {null, 19, 8, -38, 49, 65, 97 , 76, 13, 27, 4 , 18, 57};
Integer[] B = new Integer[] { 19, 8, -38, 49, 65, 97 , 76, 13, 27, 4 , 18, 57};
// ShellSort(A);
// InsertSort(A);
// A[0] = null;
// ShellSort(A);
// BubbleSort(B);
// TowWayBubbleSort(B);
// int low=0, hight=B.length-1;
// QuickSort(B, low, hight);
SelectSort(B);
PrintArray(B);
}
//直接插入排序
public static void InsertSort(Integer[] A) {
int j;
for(int i=2; i<A.length; i++) {
if(A[i-1]>A[i]) {
A[0] = A[i];
for(j=i-1; A[0]<A[j]; --j) {
//从后面开始比较,只要比存储位的值大,就往后挪,最终空出一个位置给存储位数据插入
A[j+1] = A[j];
}
A[j+1] = A[0];
}
}//时间的效率为logn^2, 空间复杂度为O(1)
}
//折半插入排序
private static void midInsertSort(Integer[] A) {
int i, j, mid, hight, low;
for(i=2; i<A.length; i++ ) {
A[0] = A[i];
low=1;//从第一个到
hight=i-1;//标记的前一个
while (low<=hight) {
mid=(low+hight)/2;
if(A[0]<A[mid]) {
hight = mid-1;//既然比A[mid]大,就从左边接着找
}else {
low = mid+1;//比A[mid]小,就从右边找
}
}//最终是找到该插入的位置。
for(j=i-1; j>=low; --j) {
A[j+1]=A[j];//将数据往后移
}
A[low] = A[0];//插入位置
}
}
//希尔排序
private static void ShellSort(Integer[] A) {
int i, j, dk;
for(dk=A.length/2; dk>=1; dk/=2 ) {
for(i=dk+1; i<A.length; i++) {//每次仅选取增量排序的那段,
if(A[i]<A[i-dk]) {
A[0] = A[i];//将最后的这个值存放在A[0]
for(j=i-dk; j>0 && A[0]<A[j]; j-=dk)
A[j+dk] = A[j];//每个子结果集其实不是在同一次排序中完成的
A[j+dk]=A[0];
}
}
}
}
//冒泡排序
private static void BubbleSort(Integer[] A) {
int i, j, len = A.length, temp;
boolean flag=true;
for(i=0; i<len&&flag; i++) {//flag是用来判断是否有序的标记,
flag=false;
for(j=len; j>i; j--) {
if(A[j-1]>A[j]) {
temp = A[j-1];
A[j-1] = A[j];
A[j] = temp;
flag = true;//发生排序就是还未有序
}
}
}
}
//双向冒泡排序,及第一次从前向后直到将最大的数置于后面,
//第二次将最小的数置于最前方
private static void TowWayBubbleSort(Integer[] A) {
int i, j, low=0, high = A.length-1;
boolean flag=true;
while (low<high&&flag) {
flag=false;
for(i=low; i<high; i++) {//flag是用来判断是否有序的标记
if(A[i+1]<A[i]) {//除了第一个和最后一个,每个元素都会比较两次
swag(A, i+1, i);
flag = true;
}
}
high--;
for(j=high; j>low; j--) {
if(A[j-1]>A[j]) {
swag(A, j-1, j);
flag = true;
}
}
low++;
}
}
//快速排序
private static void QuickSort(Integer[] A, Integer low, Integer hight) {
if(low<hight) {
int pivotpos = Partition(A, low, hight);
QuickSort(A, low, pivotpos-1);
QuickSort(A, pivotpos+1, hight);
}
}
private static int Partition(Integer[] A, Integer low, Integer hight) {
int pivot = A[low];//这里注意时拿子集合下标最低的那个
while (low<hight) {
while(low<hight&&A[hight]>=pivot) --hight;//符合条件不用换位置,继续左走
A[low] = A[hight];
while(low<hight&&A[low]<=pivot) ++low;//符合条件不用换位置,继续右走
A[hight] = A[low];
}
A[low] = pivot;
return low;
}
//简单选择排序
private static void SelectSort(Integer[] A) {
int i, j, len = A.length, min;
for(i=0; i<len; i++) {
min=i;
for(j=i; j<len; j++) {
if(A[j]<A[min]) min = j;
}
swag(A, i, min);
}
}
//交换指定下标上的数据
private static void swag(Integer[] A, Integer a, Integer b) {
int temp = A[a];
A[a] = A[b];
A[b] = temp;
}
//打印出来
private static void PrintArray(Integer[] A) {
Arrays.asList(A).forEach(item->{
System.out.print(item==null?"":item+" ");
});
}
public static<T> void gerneraMethod(T... elements) {
for(T element : elements) {
if(element instanceof Integer) {
System.out.println("处理的。。。这里是整型");
}else if (element instanceof String) {
System.out.println("处理的。。。这里是字符串");
}else if (element instanceof Double) {
System.out.println("处理的。。。这里是双精度浮点");
}else if (element instanceof Float) {
System.out.println("处理的。。。这里是单精度浮点");
}else if (element instanceof Long) {
System.out.println("处理的。。。这里是单精度浮点");
}else if (element instanceof Boolean) {
System.out.println("处理的。。。这里是布尔值");
}else if (element instanceof Date) {
System.out.println("处理的。。。这里是时间");
}
}
}
}