- 目的一:使用选择排序算法排序一个无规则整数数组。
- 代码1(常规选择排序法):
- 常规选择排序简单优化原因图:
- 代码2(优化1):
第二次简单优化:减少每次循环中不必要的初始化。 - 代码3:
public class TestArrySelectSort {
public static void main (String[] arg) {
int[] a = new int[arg.length];
for(int i=0; i<arg.length; i++) {
a[i] = Integer.parseInt(arg[i]);
}
print(a);
selectSort(a);
print(a);
}
private static void selectSort(int[] a) {
int k,temp;
for(int i=0; i<a.length; i++) {
k = i;
for(int j=k+1; j<a.length; j++) {
if (a[j]<a[k]) {
k = j;
}
}
if(k != i) {
temp = a[i];
a[i] = a[k];
a[k] = temp;
}
}
}
private static void print(int[] a) {
for(int i=0; i<a.length; i++) {
System.out.print(a[i] + " ");
}
System.out.println();
}
}
-
效果图:
注:从Dos命令行输入{2,4,6…}存于String [ ] args中,但其数据类型为String,所以要利用为int的包装类Integer,并调用Integer.parseInt()将String类型转换为int。 -
目的二:使用选择排序算法排序无序日期型数组。
-
代码:
public class TestDateSelectSort {
public static void main (String [] arg) {
//静态初始化
Date[] date = {new Date(2006,5,4),new Date(2006,7,4),new Date(2008,5,4),new Date(2004,5,9),new Date(2004,5,4)};
/*动态初始化
Date[] date = new Date[5];
date[0] = new Date(2006,5,4);
date[1] = new Date(2006,7,4);
date[2] = new Date(2008,5,4);
date[3] = new Date(2004,5,9);
date[4] = new Date(2004,5,4);*/
selectSort(date);
for(int i=0;i<date.length;i++) {
System.out.println(date[i]);
}
}
/*普通选择排序法
public static void selectSort (Date[] date) {
Date temp;
for (int i=0;i<date.length;i++) {
for (int j=i+1;j<date.length;j++) {
if(date[i].compare(date[j])>0) {
temp = date[i];
date[i] = date[j];
date[j] = temp;
}
}
}
}*/
//优化后选择排序
public static void selectSort (Date[] date) {
Date temp;
int k;
for (int i=0;i<date.length;i++) {
k = i;
for (int j=k+1;j<date.length;j++) {
if(date[k].compare(date[j])>0) {
k = j;
}
}
if (k != i) {
temp = date[i];
date[i] = date[k];
date[k] = temp;
}
}
}
}
class Date {
int year,month,day;
Date (int year,int month,int day) {
this.year = year;
this.month = month;
this.day = day;
}
public int compare (Date date) {
return year > date.year ? 1
:year < date.year? -1
:month > date.month ? 1
:month < date.month ? -1
:day > date.day ? 1
:day < date.day ? -1 : 0;
}
public String toString () {
return "Year-Month-Day:" + year + "-" + month + "-" + day;
}
}
- 效果图:
- 目的3:使用冒泡排序算法排序无规则整数数组。
- 代码:
public class TestArryBubbleSort {
public static void main (String [] args) {
int[] a = new int[args.length];
for (int i=0;i<args.length;i++) {
a[i] = Integer.parseInt(args[i]);
}
print(a);
bubble(a);
print(a);
}
public static void bubble (int[] a) {
int temp;
int len = a.length;
for (int i=len-1;i>=1;i--) {
for (int j=0;j<=i-1;j++) {
if (a[j]>a[j+1]) {
temp = a[j+1];
a[j+1] = a[j];
a[j] = temp;
}
}
}
}
public static void print (int[] a) {
for (int i=0;i<a.length;i++) {
System.out.print(a[i] + " ");
}
System.out.println();
}
}
- 效果图:
- 目的4 :使用冒泡排序算法排序无规则日期型数组。
- 代码:
public class TestDateBubbleSort {
public static void main (String [] args) {
/*TestDateBubbleSort.Date[] date = new TestDateBubbleSort.Date[5];
date[0] = new TestDateBubbleSort().new Date(2006,5,4);
date[1] = new TestDateBubbleSort().new Date(2006,7,4);
date[2] = new TestDateBubbleSort().new Date(2008,5,4);
date[3] = new TestDateBubbleSort().new Date(2004,5,9);
date[4] = new TestDateBubbleSort().new Date(2004,5,4);*/
Date[] date = new Date[5];
date[0] = new Date(2006,5,4);
date[1] = new Date(2006,7,4);
date[2] = new Date(2008,5,4);
date[3] = new Date(2004,5,9);
date[4] = new Date(2004,5,4);
bubbleSort(date);
for(int i=0;i<date.length;i++) {
System.out.println(date[i]);
}
}
public static void bubbleSort(Date[] date) {
int len = date.length;
for (int i=len-1; i>=1; i--) {
for (int j=0; j<=i-1; j++) {
if (date[j].compare(date[j+1]) > 0) {
Date temp = date[j];
date[j] = date[j+1];
date[j+1] = temp;
}
}
}
}
}
class Date {
int year,month,day;
Date (int year,int month,int day) {
this.year = year;
this.month = month;
this.day = day;
}
public int compare (Date date) {
return year > date.year ? 1
:year < date.year? -1
:month > date.month ? 1
:month < date.month ? -1
:day > date.day ? 1
:day < date.day ? -1 : 0;
}
public String toString () {
return "Year-Month-Day:" + year + "-" + month + "-" + day;
}
}
- 效果图:
排序中出现的常见错误:参考链接
冒泡排序优化可以参考:
参考1
参考2
- 目的5:查找数据,下述程序包含普通查找和二分法查找两种方式。其中二分法查找效率最高,但使用前提是数组已经进行了某种排序即数组必须有序。
- 代码:
public class TestSearch {
public static void main (String [] args) {
int[] a = {1,3,6,8,9,10,12,18,20,34};
int i = 12;
System.out.println("General search is" + " " + search(a,i));
System.out.print("Binary search is" + " " + binarySearch(a,i));
}
public static int search(int[] a, int num) {
for(int i=0;i<a.length;i++) {
if(a[i]==num) {
return i;
}
}
return -1;
}
public static int binarySearch (int[] a,int num) {
int startPro = 0;
int endPro = a.length-1;
int m = (startPro + endPro)/2;
while(startPro <= endPro) {
if(a[m] == num) return m;
if(a[m] < num) {
startPro = m+1;
}
if(a[m] > num) {
endPro = m-1;
}
m = (startPro + endPro)/2;
}
return -1;
}
}
- 效果图: