1. 排序。对文件 largeW.txt(下载链接)中的数据,编程实现冒泡排序(方法名:bubbleSort) 与 归并排序(mergeSort)
package dierci;
import java.io.*;
public class Suan {
static int az[]=new int[1110969];
static int ax=0;
static int ar[]=new int[1110969];
static int ar1[]=new int[1110969];
static int leng=1110968;
static int lin=0;
static int lag=0;
//---------------字符读取、转换---------------
public static void readFileByChars(String fileName) {
File file = new File(fileName);
Reader reader = null;
int y=0;
try {
System.out.println("以字符为单位读取文件,一次读一个字符");
// 一次读一个字符
reader = new InputStreamReader(new FileInputStream(file));
int tempchar,sum=0;
while ((tempchar = reader.read()) != -1) {
if (((char) tempchar) != '\r') {
switch(tempchar){
case 48:
y=y*10+0;
break;
case 49:
y=y*10+1;
break;
case 50:
y=y*10+2;
break;
case 51:
y=y*10+3;
break;
case 52:
y=y*10+4;
break;
case 53:
y=y*10+5;
break;
case 54:
y=y*10+6;
break;
case 55:
y=y*10+7;
break;
case 56:
y=y*10+8;
break;
case 57:
y=y*10+9;
break;
default:
{
sum=sum+1;
az[ax]=y;
ar[ax]=y;
ax=ax+1;
y=0;
}
}
}
}
reader.close();
System.out.println("ok!");
System.out.println(sum);
} catch (Exception e) {
e.printStackTrace();
}
}
//----------------冒泡排序算法-----------------------
public static void bubbleSort(int r[],int n){
int exchange=n,ang;
while(exchange!=0){
int bound=exchange;
exchange=0;
for(int j=0;j<bound;j++){
if(r[j]>r[j+1]){
ang=r[j];
r[j]=r[j+1];
r[j+1]=ang;
exchange=j;
}
}
}
}
//-------------冒泡排序算法结束--------------
//----------------归并排序算法-------------------
public static void Merge(int r[],int r1[],int s,int m,int t){
int i=0,j=0,k=0;
i=s;j=m+1;k=s;
while(i<=m && j<=t){
if(r[i]<=r[j]){
r1[k]=r[i];
k=k+1;i=i+1;
}
else{
r1[k]=r[j];
k=k+1;j=j+1;
}
}
if(i<=m) while(i<=m){
r1[k]=r[i];
k=k+1;i=i+1;
}
else while(j<=t)
{
r1[k]=r[j];
k=k+1;j=j+1;
}
}
public static void MergeSort(int r[],int r1[],int s,int t){
int m=0;
lag=lag+1;
if(s==t) r1[s]=r[s];
else {
m=(s+t)/2;
MergeSort(r,r1,s,m);
MergeSort(r,r1,m+1,t);
Merge(r1,r,s,m,t);
}
}
public static void MergePass(int r[],int r1[],int n,int h){
int i=1;
while(i<=n-2*h+1)
{
Merge(r,r1,i,i+h-1,i+2*h-1);
i+=2*h;
}
if(i<n-h-1) Merge(r,r1,i,i+h-1,n);
else
for(int k=i;k<=n;k++)
r1[k]=r[k];
}
public static void MergeSort1(int r[],int r1[],int n){
int h=1;
while(h<n){
MergePass(r,r1,n,h);
h=2*h;
MergePass(r1,r,n,h);
h=2*h;
}
}
public static int[] sort(int[] nums, int low, int high) {
int mid = (low + high) / 2;
if (low < high) {
// 左边
sort(nums, low, mid);
// 右边
sort(nums, mid + 1, high);
// 左右归并
merge(nums, low, mid, high);
}
return nums;
}
public static void merge(int[] nums, int low, int mid, int high) {
int[] temp = new int[high - low + 1];
int i = low;// 左指针
int j = mid + 1;// 右指针
int k = 0;
// 把较小的数先移到新数组中
while (i <= mid && j <= high) {
if (nums[i] < nums[j]) {
temp[k++] = nums[i++];
} else {
temp[k++] = nums[j++];
}
}
while (i <= mid) {
temp[k++] = nums[i++];
}
while (j <= high) {
temp[k++] = nums[j++];
}
for (int k2 = 0; k2 < temp.length; k2++) {
nums[k2 + low] = temp[k2];
}
}
//----------------归并排序结束-------------------
//-----------------时间计算--------------------
public static void totest(){
long startTime=System.currentTimeMillis(); //获取开始时间
System.out.println("归并排序开始.....");
while(true){
//测试的代码段
//bubbleSort(az,leng);
//MergeSort1(ar,ar1,leng);
sort(az,0,leng);
System.out.println("归并排序结束!");
long endTime=System.currentTimeMillis(); //获取结束时间
System.out.println("程序运行时间: "+(endTime-startTime)+"ms");
System.out.println("递归调用MergeSort()的次数为:"+lag);
break;
}
for(int u=0;u<300;u++)
{
//System.out.println(ar1[u]);
}
}
//--------------时间计算结束---------------------
public static void main(String[] args){
readFileByChars("G:\\largeW.txt");
totest();
}
}
冒泡排序截图:
归并排序尚未成功,暂缺!