1 package com.jdk7.chapter2.sort;
2 /**
3 * 排序功能接口
4 * @author Administrator
5 *
6 */
7 public interface SortNumber {
8 public int[] sortASCNumber(int[] intArray);
9 }
1 package com.jdk7.chapter2.sort;
2
3 /**
4 * 按升序选择排序数字
5 * @author Administrator
6 *
7 */
8 public class SelectSort implements SortNumber {
9
10 @Override
11 public int[] sortASCNumber(int[] intArray) {
12 if(intArray==null){
13 return null;
14 }else{
15 int[] array = intArray.clone();
16 for(int i=0;i<array.length;i++){
17 for(int j=i;j<array.length;j++){
18 if(array[i]>array[j]){
19 swithNumber(array,i,j);
20 }
21 }
22 }
23 return array;
24 }
25 }
26
27 public void swithNumber(int[] array,int a,int b){
28 int temp;
29 temp = array[a];
30 array[a] = array[b];
31 array[b] = temp;
32 }
33 }
1 package com.jdk7.chapter2.sort;
2 /**
3 * 按升序冒泡排序数字
4 * @author Administrator
5 *
6 */
7 public class BubbleSort implements SortNumber {
8
9 @Override
10 public int[] sortASCNumber(int[] intArray) {
11 if(intArray==null){
12 return null;
13 }else{
14 int[] array = intArray.clone();
15 int maxChangeTimes = array.length-1;
16 int changeTime = 0;
17 boolean changeTag = true;
18 //如果上一轮的最后一对两两对比没有进行交换则停止循环,每一轮循环找到最大数排在数组最后面
19 while((changeTime<maxChangeTimes) && changeTag){
20 System.out.println("while");
21 for(int i=0;i<(maxChangeTimes-changeTime);i++){
22 System.out.println(array[i]+" "+array[i+1]);
23 changeTag = false;
24 if(array[i]>array[i+1]){
25 switchNumber(array,i,i+1);
26 changeTag = true;
27 }
28 }
29 changeTime++;
30 System.out.println("changeTime: "+changeTime);
31 System.out.println("changeTag: "+changeTag);
32 }
33 return array;
34 }
35 }
36 public void switchNumber(int[] array,int a,int b){
37 int temp;
38 temp = array[a];
39 array[a] = array[b];
40 array[b] = temp;
41 }
42 }
1 package com.jdk7.chapter2.sort;
2 /**
3 * 线性插入排序
4 * @author Administrator
5 *
6 */
7 public class LinearInsertSort implements SortNumber {
8
9 @Override
10 public int[] sortASCNumber(int[] intArray) {
11 if(intArray==null){
12 return null;
13 }else{
14 int[] array = intArray.clone();
15 int index = 0;
16 int size = array.length;
17 int temp = 0;
18 for(int i=1;i<size;i++){
19 temp = array[i];
20 index = i;
21
22 System.out.println("(temp<array[index-1]) = "+(temp<array[index-1]));
23 System.out.println("(index>0) = "+((index>0)));
24 //每次循环中的数组都会按照升序排列,while中的短路与条件必须先要有index>0,然后再有右面的条件,否则数组的索引值会小于0
25 while((index>0) && (temp<array[index-1])){
26 System.out.println(array[index-1]+" "+temp);
27 array[index] = array[index-1];
28 index--;
29 }
30 System.out.println("array[index]: "+array[index]);
31 array[index] = temp; //放在while里面和while外面是一样的效果,在每次while执行时一起执行
32 SortTest.printIntArray(array);
33 }
34 return array;
35 }
36 }
37 }
1 package com.jdk7.chapter2.sort;
2 /**
3 * 快速排序
4 * @author Administrator
5 *
6 */
7 public class QuickSort implements SortNumber {
8
9 @Override
10 public int[] sortASCNumber(int[] intArray) {
11 if(intArray==null){
12 return null;
13 }else{
14 int[] array = intArray.clone();
15 return quickSort(array, 0, array.length-1);
16 }
17 }
18
19 public int[] quickSort(int[] array, int first, int last){
20 if(first<last){
21 int pos = partition(array, first, last);
22 System.out.println("pos = "+pos);
23 //所有左分治执行完成以后,再执行右分治
24 quickSort(array, first, pos-1);
25 quickSort(array, pos+1, last);
26 }
27 return array;
28 }
29
30 public int partition(int[] array, int first, int last){
31 System.out.println("调用partition方法");
32 int temp = array[first];
33 int pos = first;
34 for(int i=first+1;i<=last;i++){
35 if(array[i]<temp){
36 pos++;
37 //连续比第一位小都不需要换位,遇到比第一位大的数跳过进行下一次循环,在后面的循环中遇到比第一位小的值则将该值与大值进行换位,直到最大值在最末位
38 swap(array, pos, i);
39 SortTest.printIntArray(array);
40 }
41 }
42 //将数组中第二大数值放置在倒数第二位
43 swap(array, first, pos);
44 System.out.println("将分治点和第一个值进行交换");
45 SortTest.printIntArray(array);
46 return pos;
47 }
48
49 public void swap(int[] array, int src, int dest){
50 int temp = array[src];
51 array[src] = array[dest];
52 array[dest] = temp;
53 }
54
55 }