package test;
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;
public class sort {
/**
*Author:April
*Date:2018.12.1
*Version:0.1
*Description:1、选择排序、冒泡排序、归并排序、快速排序、插入排序的算法原理。
* 2.不同排序算法时间效率的经验分析方法,验证理论分析与经验分析的一致性。
*
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
func();
}
private static void func() {
// TODO Auto-generated method stub
System.out.println("1.选择排序 2.冒泡排序 3.合并排序 4.快速排序 5.插入排序");
@SuppressWarnings("resource")
Scanner sc = new Scanner(System.in);
System.out.println("请输入要选择的字母:");
int num = sc.nextInt();
//int num = sc.nextInt();
switch(num){
case 1:
//System.out.println("1");
select();
break;
case 2:
bubble();
break;
case 3:
merge();
break;
case 4:
fast();
break;
case 5:
insert();
break;
default:
System.out.println("请输入正确的字母");
}
}
//插入排序
private static void insert() {
// TODO Auto-generated method stub
//数据规模为10时
double begin = System.currentTimeMillis(); // 程序开始时间,调用系统的当前时间
int[] nums = new int[10]; //定义一个一维数组
int count=0;
while(count<10) {
nums[count]=(int)(Math.random()*100);//产生100以内的随机数给nums
count++;
}
//插入排序
int insertNote;
for (int i = 1; i < nums.length; i++) {// 从数组的第二个元素开始循环将数组中的元素插入
insertNote = nums[i];// 设置数组中的第2个元素为第一次循环要插入的数据
int j = i - 1;
while ( j >= 0 && insertNote < nums[j]) {
nums[j + 1] = nums[j];// 如果要插入的元素小于第j个元素,就将第j个元素向后移动
j--;
}
nums[j + 1] = insertNote;// 直到要插入的元素不小于第j个元素,将insertNote插入到数组中
}
System.out.println("数据规模为"+nums.length+"时");//数组长度
System.out.println("排序后序列为:");
for (int i = 0; i < nums.length; i++) { //循环并打印出每个数组的数字
System.out.print(nums[i]+"\t") ;
}
double end = System.currentTimeMillis(); // 程序结束时间,调用系统当前时间
double time = end - begin;// 程序的运行时间
System.out.println("\n排序所花平均时间(ms):"+time / 60*1000 );
//数据规模为100时
double begin1 = System.currentTimeMillis(); // 程序开始时间,调用系统的当前时间
int[] nums1 = new int[100]; //定义一个一维数组
int count1=0;
while(count1<100) {
nums1[count1]=(int)(Math.random()*100);//产生100以内的随机数给nums
count1++;
}
//插入排序
int insertNote1;
for (int i = 1; i < nums.length; i++) {// 从数组的第二个元素开始循环将数组中的元素插入
insertNote1 = nums[i];// 设置数组中的第2个元素为第一次循环要插入的数据
int j = i - 1;
while ( j >= 0 && insertNote1 < nums[j]) {
nums[j + 1] = nums[j];// 如果要插入的元素小于第j个元素,就将第j个元素向后移动
j--;
}
nums[j + 1] = insertNote1;// 直到要插入的元素不小于第j个元素,将insertNote插入到数组中
}
System.out.println("数据规模为"+nums1.length+"时");//数组长度
System.out.println("排序后序列为:");
for (int i = 0; i < nums1.length; i++) { //循环并打印出每个数组的数字
System.out.print(nums1[i]+"\t") ;
}
double end1 = System.currentTimeMillis(); // 程序结束时间,调用系统当前时间
double time1 = end1 - begin1;// 程序的运行时间
System.out.println("\n排序所花平均时间(ms):"+time1 / 60*1000 );
//数据规模为1000时
double begin2 = System.currentTimeMillis(); // 程序开始时间,调用系统的当前时间
int[] nums2 = new int[1000]; //定义一个一维数组
int count2=0;
while(count2<1000) {
nums2[count2]=(int)(Math.random()*100);//产生100以内的随机数给nums
count2++;
}
//插入排序
int insertNote2;
for (int i = 1; i < nums.length; i++) {// 从数组的第二个元素开始循环将数组中的元素插入
insertNote2 = nums[i];// 设置数组中的第2个元素为第一次循环要插入的数据
int j = i - 1;
while ( j >= 0 && insertNote2 < nums[j]) {
nums[j + 1] = nums[j];// 如果要插入的元素小于第j个元素,就将第j个元素向后移动
j--;
}
nums[j + 1] = insertNote2;// 直到要插入的元素不小于第j个元素,将insertNote插入到数组中
}
System.out.println("数据规模为"+nums2.length+"时");//数组长度
System.out.println("排序后序列为:");
for (int i = 0; i < nums2.length; i++) { //循环并打印出每个数组的数字
System.out.print(nums2[i]+"\t") ;
}
double end2 = System.currentTimeMillis(); // 程序结束时间,调用系统当前时间
double time2 = end2 - begin2;// 程序的运行时间
System.out.println("\n排序所花平均时间(ms):"+time2 / 60*1000 );
//数据规模为10000时
double begin3 = System.currentTimeMillis(); // 程序开始时间,调用系统的当前时间
int[] nums3 = new int[10000]; //定义一个一维数组
int count3=0;
while(count3<10000) {
nums3[count3]=(int)(Math.random()*100);//产生100以内的随机数给nums
count3++;
}
//插入排序
int insertNote3;
for (int i = 1; i < nums.length; i++) {// 从数组的第二个元素开始循环将数组中的元素插入
insertNote3 = nums[i];// 设置数组中的第2个元素为第一次循环要插入的数据
int j = i - 1;
while ( j >= 0 && insertNote3 < nums[j]) {
nums[j + 1] = nums[j];// 如果要插入的元素小于第j个元素,就将第j个元素向后移动
j--;
}
nums[j + 1] = insertNote3;// 直到要插入的元素不小于第j个元素,将insertNote插入到数组中
}
System.out.println("数据规模为"+nums3.length+"时");//数组长度
System.out.println("排序后序列为:");
for (int i = 0; i < nums3.length; i++) { //循环并打印出每个数组的数字
System.out.print(nums3[i]+"\t") ;
}
double end3 = System.currentTimeMillis(); // 程序结束时间,调用系统当前时间
double time3 = end3 - begin3;// 程序的运行时间
System.out.println("\n排序所花平均时间(ms):"+time3 / 60*1000 );
//数据规模为100000时
double begin4 = System.currentTimeMillis(); // 程序开始时间,调用系统的当前时间
int[] nums4 = new int[100000]; //定义一个一维数组
int count4=0;
while(count4<100000) {
nums4[count4]=(int)(Math.random()*100);//产生100以内的随机数给nums
count4++;
}
//插入排序
int insertNote4;
for (int i = 1; i < nums.length; i++) {// 从数组的第二个元素开始循环将数组中的元素插入
insertNote4 = nums[i];// 设置数组中的第2个元素为第一次循环要插入的数据
int j = i - 1;
while ( j >= 0 && insertNote4 < nums[j]) {
nums[j + 1] = nums[j];// 如果要插入的元素小于第j个元素,就将第j个元素向后移动
j--;
}
nums[j + 1] = insertNote4;// 直到要插入的元素不小于第j个元素,将insertNote插入到数组中
}
System.out.println("数据规模为"+nums4.length+"时");//数组长度
// System.out.println("排序后序列为:");
// for (int i = 0; i < nums4.length; i++) { //循环并打印出每个数组的数字
// System.out.print(nums4[i]+"\t") ;
// }
double end4 = System.currentTimeMillis(); // 程序结束时间,调用系统当前时间
double time4 = end4 - begin4;// 程序的运行时间
System.out.println("\n排序所花平均时间(ms):"+time4 / 60*1000 );
}
//快速排序
private static void fast() {
// TODO Auto-generated method stub
}
//合并排序
private static void merge() {
// TODO Auto-generated method stub
}
//冒泡排序
private static void bubble() {
// TODO Auto-generated method stub
//数据规模为10时
double begin = System.currentTimeMillis(); // 程序开始时间,调用系统的当前时间
int[] nums = new int[10]; //定义一个一维数组
int count=0;
while(count<10) {
nums[count]=(int)(Math.random()*100);//产生100以内的随机数给nums
count++;
}
//冒泡排序
for (int i = 0; i < nums.length - 1; i++) {// 外层循环控制排序趟数
for (int j = 0; j < nums.length - 1 - i; j++) {// 内层循环控制每一趟排序多少次
if (nums[j] > nums[j + 1]) {
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
}
System.out.println("数据规模为"+nums.length+"时");//数组长度
System.out.println("排序后序列为:");
for (int i = 0; i < nums.length; i++) { //循环并打印出每个数组的数字
System.out.print(nums[i]+"\t") ;
}
double end = System.currentTimeMillis(); // 程序结束时间,调用系统当前时间
double time = end - begin;// 程序的运行时间
System.out.println("\n排序所花平均时间(ms):"+time / 60*1000 );
//数据规模为100时
double begin1 = System.currentTimeMillis(); // 程序开始时间,调用系统的当前时间
int[] nums1 = new int[100]; //定义一个一维数组
int count1=0;
while(count1<100) {
nums1[count1]=(int)(Math.random()*100);//产生100以内的随机数给nums
count1++;
}
//冒泡排序
for (int i = 0; i < nums.length - 1; i++) {// 外层循环控制排序趟数
for (int j = 0; j < nums.length - 1 - i; j++) {// 内层循环控制每一趟排序多少次
if (nums[j] > nums[j + 1]) {
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
}
System.out.println("数据规模为"+nums1.length+"时");//数组长度
System.out.println("排序后序列为:");
for (int i = 0; i < nums1.length; i++) { //循环并打印出每个数组的数字
System.out.print(nums1[i]+"\t") ;
}
double end1 = System.currentTimeMillis(); // 程序结束时间,调用系统当前时间
double time1 = end1 - begin1;// 程序的运行时间
System.out.println("\n排序所花平均时间(ms):"+time1 / 60*1000 );
//数据规模为1000时
double begin2 = System.currentTimeMillis(); // 程序开始时间,调用系统的当前时间
int[] nums2 = new int[1000]; //定义一个一维数组
int count2=0;
while(count2<1000) {
nums2[count2]=(int)(Math.random()*100);//产生100以内的随机数给nums
count2++;
}
//冒泡排序
//冒泡排序
for (int i = 0; i < nums.length - 1; i++) {// 外层循环控制排序趟数
for (int j = 0; j < nums.length - 1 - i; j++) {// 内层循环控制每一趟排序多少次
if (nums[j] > nums[j + 1]) {
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
}
System.out.println("数据规模为"+nums2.length+"时");//数组长度
System.out.println("排序后序列为:");
for (int i = 0; i < nums2.length; i++) { //循环并打印出每个数组的数字
System.out.print(nums2[i]+"\t") ;
}
double end2 = System.currentTimeMillis(); // 程序结束时间,调用系统当前时间
double time2 = end2 - begin2;// 程序的运行时间
System.out.println("\n排序所花平均时间(ms):"+time2 / 60*1000 );
//数据规模为10000时
double begin3 = System.currentTimeMillis(); // 程序开始时间,调用系统的当前时间
int[] nums3 = new int[10000]; //定义一个一维数组
int count3=0;
while(count3<10000) {
nums3[count3]=(int)(Math.random()*100);//产生100以内的随机数给nums
count3++;
}
//冒泡排序
//冒泡排序
for (int i = 0; i < nums.length - 1; i++) {// 外层循环控制排序趟数
for (int j = 0; j < nums.length - 1 - i; j++) {// 内层循环控制每一趟排序多少次
if (nums[j] > nums[j + 1]) {
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
}
System.out.println("数据规模为"+nums3.length+"时");//数组长度
System.out.println("排序后序列为:");
for (int i = 0; i < nums3.length; i++) { //循环并打印出每个数组的数字
System.out.print(nums3[i]+"\t") ;
}
double end3 = System.currentTimeMillis(); // 程序结束时间,调用系统当前时间
double time3 = end3 - begin3;// 程序的运行时间
System.out.println("\n排序所花平均时间(ms):"+time3 / 60*1000 );
//数据规模为100000时
double begin4 = System.currentTimeMillis(); // 程序开始时间,调用系统的当前时间
int[] nums4 = new int[100000]; //定义一个一维数组
int count4=0;
while(count4<100000) {
nums4[count4]=(int)(Math.random()*100);//产生100以内的随机数给nums
count4++;
}
//冒泡排序
for (int i = 0; i < nums.length - 1; i++) {// 外层循环控制排序趟数
for (int j = 0; j < nums.length - 1 - i; j++) {// 内层循环控制每一趟排序多少次
if (nums[j] > nums[j + 1]) {
int temp = nums[j]; //temp是用于交换时的临时变量
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
}
System.out.println("数据规模为"+nums4.length+"时");//数组长度
// System.out.println("排序后序列为:");
// for (int i = 0; i < nums4.length; i++) { //循环并打印出每个数组的数字
// System.out.print(nums4[i]+"\t") ;
// }
double end4 = System.currentTimeMillis(); // 程序结束时间,调用系统当前时间
double time4 = end4 - begin4;// 程序的运行时间
System.out.println("\n排序所花平均时间(ms):"+time4 / 60*1000 );
}
//选择排序
private static void select() {
// TODO Auto-generated method stub
//数据规模为10时
double begin = System.currentTimeMillis(); // 程序开始时间,调用系统的当前时间
int[] nums = new int[10]; //定义一个一维数组
int count=0;
while(count<10) {
nums[count]=(int)(Math.random()*100);//产生100以内的随机数给nums
count++;
}
//选择排序
for(int i = 0; i < nums.length-1; ++i){ //外层循环数组寻找最小的数
int k = i;
for(int j = i; j < nums.length; ++j){ //内层循环,做比较
if(nums[k] > nums[j]){ //若j比k小,则把j放入前面的位置
k = j;
}
}
if(k != i){ //交换元素
int temp = nums[i]; //temp是用于交换时的临时变量
nums[i] = nums[k];
nums[k] = temp;
}
}
System.out.println("数据规模为"+nums.length+"时");//数组长度
System.out.println("排序后序列为:");
for (int i = 0; i < nums.length; i++) { //循环并打印出每个数组的数字
System.out.print(nums[i]+"\t") ;
}
double end = System.currentTimeMillis(); // 程序结束时间,调用系统当前时间
double time = end - begin;// 程序的运行时间
System.out.println("\n排序所花平均时间(ms):"+time / 60*1000 );
//数据规模为100时
double begin1 = System.currentTimeMillis(); // 程序开始时间,调用系统的当前时间
int[] nums1 = new int[100]; //定义一个一维数组
int count1=0;
while(count1<100) {
nums1[count1]=(int)(Math.random()*100);//产生100以内的随机数给nums
count1++;
}
//选择排序
for(int i = 0; i < nums1.length-1; ++i){ //外层循环数组寻找最小的数
int k = i;
for(int j = i; j < nums1.length; ++j){ //内层循环,做比较
if(nums1[k] > nums1[j]){ //若j比k小,则把j放入前面的位置
k = j;
}
}
if(k != i){ //交换元素
int temp = nums1[i]; //temp是用于交换时的临时变量
nums1[i] = nums1[k];
nums1[k] = temp;
}
}
System.out.println("数据规模为"+nums1.length+"时");//数组长度
System.out.println("排序后序列为:");
for (int i = 0; i < nums1.length; i++) { //循环并打印出每个数组的数字
System.out.print(nums1[i]+"\t") ;
}
double end1 = System.currentTimeMillis(); // 程序结束时间,调用系统当前时间
double time1 = end1 - begin1;// 程序的运行时间
System.out.println("\n排序所花平均时间(ms):"+time1 / 60*1000 );
//数据规模为1000时
double begin2 = System.currentTimeMillis(); // 程序开始时间,调用系统的当前时间
int[] nums2 = new int[1000]; //定义一个一维数组
int count2=0;
while(count2<1000) {
nums2[count2]=(int)(Math.random()*100);//产生100以内的随机数给nums
count2++;
}
//选择排序
for(int i = 0; i < nums2.length-1; ++i){ //外层循环数组寻找最小的数
int k = i;
for(int j = i; j < nums2.length; ++j){ //内层循环,做比较
if(nums2[k] > nums2[j]){ //若j比k小,则把j放入前面的位置
k = j;
}
}
if(k != i){ //交换元素
int temp = nums2[i]; //temp是用于交换时的临时变量
nums2[i] = nums2[k];
nums2[k] = temp;
}
}
System.out.println("数据规模为"+nums2.length+"时");//数组长度
System.out.println("排序后序列为:");
for (int i = 0; i < nums2.length; i++) { //循环并打印出每个数组的数字
System.out.print(nums2[i]+"\t") ;
}
double end2 = System.currentTimeMillis(); // 程序结束时间,调用系统当前时间
double time2 = end2 - begin2;// 程序的运行时间
System.out.println("\n排序所花平均时间(ms):"+time2 / 60*1000 );
//数据规模为10000时
double begin3 = System.currentTimeMillis(); // 程序开始时间,调用系统的当前时间
int[] nums3 = new int[10000]; //定义一个一维数组
int count3=0;
while(count3<10000) {
nums3[count3]=(int)(Math.random()*100);//产生100以内的随机数给nums
count3++;
}
//选择排序
for(int i = 0; i < nums3.length-1; ++i){ //外层循环数组寻找最小的数
int k = i;
for(int j = i; j < nums3.length; ++j){ //内层循环,做比较
if(nums3[k] > nums3[j]){ //若j比k小,则把j放入前面的位置
k = j;
}
}
if(k != i){ //交换元素
int temp = nums3[i]; //temp是用于交换时的临时变量
nums3[i] = nums3[k];
nums3[k] = temp;
}
}
System.out.println("数据规模为"+nums3.length+"时");//数组长度
System.out.println("排序后序列为:");
for (int i = 0; i < nums3.length; i++) { //循环并打印出每个数组的数字
System.out.print(nums3[i]+"\t") ;
}
double end3 = System.currentTimeMillis(); // 程序结束时间,调用系统当前时间
double time3 = end3 - begin3;// 程序的运行时间
System.out.println("\n排序所花平均时间(ms):"+time3 / 60*1000 );
//数据规模为100000时
double begin4 = System.currentTimeMillis(); // 程序开始时间,调用系统的当前时间
int[] nums4 = new int[100000]; //定义一个一维数组
int count4=0;
while(count4<100000) {
nums4[count4]=(int)(Math.random()*100);//产生100以内的随机数给nums
count4++;
}
//选择排序
for(int i = 0; i < nums4.length-1; ++i){ //外层循环数组寻找最小的数
int k = i;
for(int j = i; j < nums4.length; ++j){ //内层循环,做比较
if(nums4[k] > nums4[j]){ //若j比k小,则把j放入前面的位置
k = j;
}
}
if(k != i){ //交换元素
int temp = nums4[i]; //temp是用于交换时的临时变量
nums4[i] = nums4[k];
nums4[k] = temp;
}
}
System.out.println("数据规模为"+nums4.length+"时");//数组长度
// System.out.println("排序后序列为:");
// for (int i = 0; i < nums4.length; i++) { //循环并打印出每个数组的数字
// System.out.print(nums4[i]+"\t") ;
// }
double end4 = System.currentTimeMillis(); // 程序结束时间,调用系统当前时间
double time4 = end4 - begin4;// 程序的运行时间
System.out.println("\n排序所花平均时间(ms):"+time4 / 60*1000 );
}
}