java 实现 插入排序 希尔排序 冒泡排序 快速排序 堆排序 归并排序 【完美版】...

1.package net.okren.java;   
2.import java.util.*;   
3.import java.io.*;   
4.  
5.public class SortTest{   
6.       
7.    //插入排序;   
8.    public static void insertionSort(Comparable[] data){   
9.        System.out.println("insertSort() ...");   
10.        int j;   
11.        for(int p = 1; p < data.length; p++){   
12.            Comparable temp = data[p];   
13.            for(j = p; j > 0 && temp.compareTo(data[j - 1]) < 0; j--){   
14.                data[j] = data[j - 1];   
15.            }   
16.               
17.            data[j] = temp;   
18.        }      
19.    }   
20.       
21.       
22.    //希尔排序;   
23.    public static void shellSort(Comparable[] data){   
24.        System.out.println("shellSort() ...");   
25.        int j;   
26.        for(int gap = data.length / 2; gap > 0; gap /= 2){   
27.               
28.            for(int i = gap; i < data.length; i++){   
29.                Comparable temp = data[i];   
30.                for(j = i; j >= gap && temp.compareTo(data[j - gap]) < 0; j -= gap){   
31.                    data[j] = data[j - gap];   
32.                }   
33.                data[j] = temp;   
34.            }   
35.        }          
36.    }   
37.       
38.       
39.    //堆排序;   
40.    public static void heapSort(Comparable[] data){   
41.        System.out.println("heapSort() ...");   
42.            //buildHeap,   
43.        for(int i = data.length / 2; i >= 0; i--){   
44.            shiftDown(data, i, data.length);   
45.               
46.        }   
47.           
48.        //deleteMax,   
49.        for(int i = data.length - 1; i > 0; i--){   
50.            swap(data, 0, i);   
51.            shiftDown(data, 0, i);   
52.        }   
53.       
54.    }   
55.       
56.    private static void shiftDown(Comparable[] data, int i, int n){   
57.        int child;   
58.        Comparable temp;   
59.        for(temp = data[i]; leftChild(i) < n; i = child){   
60.            child = leftChild(i);   
61.            if(child != n - 1 && data[child].compareTo(data[child + 1]) < 0){   
62.                child++;   
63.            }   
64.            if(temp.compareTo(data[child]) < 0){   
65.                data[i] = data[child];   
66.            }else{   
67.                break;   
68.            }   
69.        }   
70.        data[i] = temp;   
71.    }   
72.       
73.    private static int leftChild(int i){   
74.        return 2 * i + 1;   
75.    }   
76.       
77.       
78.       
79.       
80.       
81.       
82.    //冒泡排序   
83.    public static void bubbleSort(Comparable[] data){   
84.        System.out.println("bubbleSort() ...");   
85.        for(int i = data.length - 1; i > 0; i--){   
86.            boolean isChanged = false;   
87.            for(int j = 0; j < i; j++){   
88.                if(data[j].compareTo(data[j + 1]) > 0){   
89.                    Comparable temp = data[j];   
90.                    data[j] = data[j + 1];   
91.                    data[j + 1] = temp;   
92.                    isChanged = true;   
93.                }   
94.                   
95.            }   
96.            if(!isChanged) break;   
97.        }   
98.           
99.    }   
100.       
101.    //快速排序;   
102.       
103.       
104.    public static void quickSort(Comparable[] data){   
105.        System.out.println("quickSort() ...");   
106.           
107.        quickSort(data, 0, data.length - 1);           
108.    }   
109.       
110.    private static void quickSort(Comparable[] data, int left, int right){   
111.        if(left + 10 <= right){   
112.            Comparable pivot = middle3(data, left, right);//执行三数中值分割法,   
113.            int i = left, j = right - 1;   
114.            for(;;){   
115.                while(data[++i].compareTo(pivot) < 0){}   
116.                while(data[--j].compareTo(pivot) > 0){}   
117.                if(i < j){   
118.                    swap(data, i, j);   
119.                }else{   
120.                    break;   
121.                }   
122.            }   
123.               
124.            swap(data, i, right - 1);   
125.            quickSort(data, left, i -1);   
126.            quickSort(data, i + 1, right);   
127.               
128.        }else{   
129.            System.out.println("insertionSort() ...");   
130.            insertionSort(data);   
131.        }   
132.    }   
133.       
134.    private static Comparable middle3(Comparable[] data, int left, int right){   
135.        int center = (left + right) / 2;   
136.        if(data[center].compareTo(data[left]) < 0){   
137.            swap(data, left, center);   
138.        }   
139.        if(data[right].compareTo(data[left]) < 0){   
140.            swap(data, left, right);   
141.        }   
142.        if(data[right].compareTo(data[center]) < 0){   
143.            swap(data, center, right);   
144.        }   
145.        swap(data, center, right - 1);   
146.        return data[right - 1];   
147.    }   
148.       
149.    private static void swap(Comparable[] data, int i, int j){   
150.        Comparable temp = data[i];   
151.        data[i] = data[j];   
152.        data[j] = temp;   
153.    }   
154.       
155.    //归并排序;   
156.       
157.    public static void mergeSort(Comparable[] data){   
158.        System.out.println("mergeSort() ...");   
159.         Comparable[] tempData = new Comparable[data.length];   
160.         mergeSort(data, tempData, 0, data.length - 1);   
161.           
162.           
163.    }   
164.       
165.       
166.    private static void mergeSort(Comparable[] data, Comparable[] tempData, int left, int right){   
167.           
168.        if(left < right){   
169.            int center = (left + right) / 2;   
170.          mergeSort(data, tempData, left, center);   
171.          mergeSort(data, tempData, center + 1, right);   
172.          merge(data,tempData, left, center + 1, right);   
173.        }   
174.    }   
175.       
176.    private static void merge(Comparable[] data, Comparable[] tempData, int leftPos, int rightPos, int rightEnd){   
177.        int leftEnd = rightPos - 1;   
178.        int tempPos = leftPos;   
179.        int num = rightEnd - leftPos + 1;   
180.           
181.        while(leftPos <= leftEnd && rightPos <= rightEnd){   
182.            if(data[leftPos].compareTo(data[rightPos]) <= 0){   
183.                tempData[tempPos++] = data[leftPos++];   
184.            }else{   
185.                tempData[tempPos++] = data[rightPos++];   
186.                   
187.            }   
188.        }   
189.           
190.        while(leftPos <= leftEnd){   
191.            tempData[tempPos++] = data[leftPos++];   
192.        }   
193.           
194.        while(rightPos <= rightEnd){   
195.            tempData[tempPos++] = data[rightPos++];   
196.        }   
197.           
198.        for(int i = 0; i < num; i++, rightEnd--){   
199.            data[rightEnd] = tempData[rightEnd];   
200.        }   
201.    }   
202.       
203.       
204.    // 构建初始数据   
205.    public static Comparable[] getData(int num){   
206.        Comparable[] data = new Comparable[num];   
207.        Random r = new Random();   
208.        for(int i = 0; i < data.length; i++){   
209.            data[i] = r.nextInt(num);   
210.        }   
211.           
212.        return data;   
213.    }   
214.       
215.    //从键盘输入 构建初始数据;   
216.    public static Comparable[] getInputData(){   
217.           
218.           
219.        System.out.println("eg.: 3,6,1,2,7,2,6, ...");   
220.        try{   
221.               
222.             BufferedReader in = new BufferedReader(new InputStreamReader(System.in));   
223.           String line = in.readLine();   
224.           StringTokenizer st = new StringTokenizer(line, ",");   
225.           Comparable[] data = new Comparable[st.countTokens()];   
226.           int i = 0;   
227.           while(st.hasMoreTokens()){   
228.               data[i++] = Integer.parseInt(st.nextToken());   
229.           }   
230.            
231.           return data;   
232.               
233.           
234.    }catch(IOException e){   
235.        e.printStackTrace();   
236.        return null;   
237.    }   
238.           
239.    }   
240.       
241.       
242.    public static void main(String[] args){   
243.           
244.        //Comparable[] data = getData(20);   
245.        Comparable[] data = getInputData();   
246.        //排序前输出   
247.        for(int i = 0; i < data.length; i++){   
248.            System.out.print(data[i] + ", ");   
249.        }   
250.        System.out.println();   
251.        //排序   
252.        //insertionSort(data);   
253.        //shellSort(data);   
254.        //bubbleSort(data);   
255.        //mergeSort(data);   
256.        //quickSort(data);   
257.        heapSort(data);   
258.        //排序后输出   
259.        for(int i = 0; i < data.length; i++){   
260.            System.out.print(data[i] + ", ");   
261.        }   
262.        System.out.println();   
263.           
264.    }   
265.}  

 

你可能感兴趣的:(算法)