插入式排序
//插入式排序:有插入排序法;谢耳排序法;二叉树排序法
public class插入式排序 {
public static void main(String[] args) {
int arr[]={5,4,2,12,6,5};
InsertSort.sort(arr);
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
}
}
class InsertSort{
//插入排序法
static void sort(int arr[]){
for(int i=1;i<arr.length;i++){
int insertVal=arr[i];
//insertVal准备和前一个数比较
int index=i-1;
while(index>=0&&insertVal<arr[index]){
//把arr[index]向后移动
arr[index+1]=arr[index];
//让index向前移动
index--;
}
//将insertVal插入到适当位置
arr[index+1]=insertVal;
}
}
}
交换式排序
//内部排序:在内存中完成排序
//外部排序:数据量大,要借助外部进行排序
//交换式排序:有冒泡排序法;快速排序法
public class交换式排序 {
public static void main(String[] args) {
int arr[]={1,2,-11,5,4};
//冒泡排序
// int temp=0;
// //外层循环:决定运行几次(个数减1次)
// for(int i=0;i<arr.length-1;i++){
// //内层循环:逐个比较,如果前一个数比后一个数大,则交换
// //因为每次都会少一个数比较,所以-i
// for(int j=0;j<arr.length-1-i;j++){
// //大于号由小到大,小于号由大到小
// if(arr[j]>arr[j+1]){
// temp=arr[j];
// arr[j]=arr[j+1];
// arr[j+1]=temp;
// }
// }
// }
//快速排序
Quick.test(0,arr.length-1,arr);
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
}
}
class Quick{
//快速排序法:抽一个数,把小的放左边,大的放右边,左右的数以此类推
//速度越快,方法越难 =.=!
static void test(int left,int right,int[] array){
int l=left;
int r=right;
//中间变量
int pivot=array[(left+right)/2];
int temp=0;
while(l<r){
while(array[l]<pivot){
l++;
}
while(array[r]>pivot){
r--;
}
if(l>=r){
break;
}
temp=array[l];
array[l]=array[r];
array[r]=temp;
if(array[l]==pivot){
--r;
}
if(array[r]==pivot){
++l;
}
}
if(l==r){
l++;
r--;
}
if(left<r){
test(left,r,array);
}
if(right>l){
test(l,right,array);
}
}
}
选择式排序
import java.util.Calendar;
//选择式排序:有选择排序法;堆排序法
public class选择式排序 {
public static void main(String[] args) {
//int arr[]={18,5,6,12,1,9};
int temp=0;
//产生一个1~10000的随机数
int len=100000;
int[] arr=new int[len];
for(int i=0;i<len;i++){
//Math.random()会产生一个0~1的数
int t=(int)(Math.random()*10000);
arr[i]=t;
}
//在排序前打印时间,Calendar:日历
Calendar cal=Calendar.getInstance();
System.out.println("排序前:"+cal.getTime());
//选择排序:比冒泡排序快
for(int j=0;j<arr.length-1;j++){
//认为第一个数就是最小
int min=arr[j];
//记录最小数下标
int minIndex=j;
for(int k=j+1;k<arr.length;k++){
if(min>arr[k]){
min=arr[k];
minIndex=k;
}
}
//当退出循环,找到最小值
temp=arr[j];
arr[j]=arr[minIndex];
arr[minIndex]=temp;
}
//Calendar(单态);重新得到时间
cal=Calendar.getInstance();
System.out.println("排序后:"+cal.getTime());
//循环输出,输出耗时大
/*for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}*/
}
}