Fork me on GitHub

几种常用排序

选择排序:把第一个元素和其他元素依次对比,第一次比较完后 ,和最小的交换位置,即第一次最小的值出现在前面。然后第二个数和后面的进行比较 以此类推。(具体可参考https://www.cnblogs.com/nullering/p/9537321.html)

//简单选择排序,按自然顺序
public static void selectsort(int[] array){
int min, index, temp;//定义最小值索引 。
for(int i = 0; i < array.length - 1; i++){ // N - 1 趟
min = i;
//查找选择最小元素值的下标索引值
for(index = i + 1; index < array.length; index++){
if(array[min] > array[index])
min = index;
}
//交换位置
if(min != i){
temp = array[min];
array[min] = array[i];
array[i] = temp;
}
}
}

冒泡排序:相邻元素两两比较,大的往后放,第一次比较完后,最大值出现在末尾即最大索引处。时间复杂度O(n²)

 1 public static int maopao(int[ ] arr){
 2 
 3 for(int i=0;i<arr.length-1;i++){
 4 
 5 for(int j=0;j<arr.length-1-i;j++){
 6 
 7   if(a[j]>a[j+1]){
 8 
 9 int temp=arr[j];
10 
11 arr[j]=arr[j+1];
12 
13 arr[j+1]=temp;}
14 
15 } 
16 
17 return temp;
18 
19  }
20 }

插入排序:第一个数据不动,从第二个开始和它前面的进行比较,比它大的向后排,比它小则不动。

1,

2,

3,

 1 import java.util.Arrays;
 2 
 3 //插入排序
 4 //第一个数据不动,从第二个开始和它前面的进行比较,比它大的向后排,比它小则不动
 5 public class Insert {
 6     public static void sort(int[] arr) {
 7         
 8         int insertData;// 要插入的数据 
 9         // 从数组的第二个元素开始循环将数组中的元素插入 
10         for (int i = 1; i < arr.length; i++) { 
11             insertData = arr[i]; 
12             /*for(int j=i-1;j>=0;j--){
13               if(a[i]<a[j]){
14                   arr[j + 1] = arr[j]; 
15               }else{
16                 break;
17               }
18             }*/
19           int j = i - 1; 
20           // 如果要插入的元素小于第j个元素,就将第j个元素向后移 
21           while ((j >= 0) && insertData < arr[j]) { 
22             arr[j + 1] = arr[j]; 
23             j--;  
24           } 
25           // 直到要插入的元素不小于第j个元素,将insertNote插入到数组中 
26           arr[j + 1] = insertData; 
27           //System.out.println(Arrays.toString(arr));
28         } 
29         System.out.println(Arrays.toString(arr));
30      }
31 
32     public static void main(String[] args) {
33         int arr[]={2,6,5,4,7,8};
34         //int arr[]=null;
35         //int arr[]={2,1};
36         //int arr[]={2};//[2]
37         sort(arr);
38         
39     }
40 
41 }

归并排序:

 1 package zh.ysj;
 2 
 3 class guibingpaixu {
 4 
 5     public static int[] sort(int[] a,int low,int high){
 6         int mid = (low+high)/2;
 7         if(low<high){
 8             sort(a,low,mid);
 9             sort(a,mid+1,high);
10             //左右归并
11             paixu(a,low,mid,high);
12         }
13         return a;
14     }
15      
16     public static void paixu(int[] a, int low, int mid, int high) {
17         int i= low;
18         int j = mid+1;
19         int k=0;
20         int[] temp = new int[high-low+1];
21         // 把较小的数先移到新数组中
22         while(i<=mid && j<=high){
23             if(a[i]<a[j]){
24                 temp[k++] = a[i++];
25             }else{
26                 temp[k++] = a[j++];
27             }
28         }
29         // 把左边剩余的数移入数组 
30         while(i<=mid){
31             temp[k++] = a[i++];
32         }
33         // 把右边边剩余的数移入数组
34         while(j<=high){
35             temp[k++] = a[j++];
36         }
37         // 把新数组中的数覆盖数组
38         for(int x=0;x<temp.length;x++){
39             a[x+low] = temp[x];
40         }
41     }
42     
43     
44     
45     
46     public static void main(String[] args) {
47         // TODO Auto-generated method stub
48        int[]a ={2,5,8,7,4,5,3};
49        sort(a,0,a.length);
50     
51 
52 }
53 }

快速排序

import java.util.Arrays;
/*
* 快速排序:
* 一趟快速排序的算法是:   
* 1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;   
* 2)以第一个数组元素作为关键数据,赋值给key,即 key=A[0];   
* 3)从j开始向前搜索,即由后开始向前搜索(j=j-1即j--),
* 找到第一个小于key的值A[j],A[i]与A[j]交换;   
* 4)从i开始向后搜索,即由前开始向后搜索(i=i+1即i++),
* 找到第一个大于key的A[i],A[i]与A[j]交换;   
* 5)重复第3、4、5步,直到 I=J;
* (3,4步是在程序中没找到时候j=j-1,i=i+1,直至找到为止。
* 找到并交换的时候i, j指针位置不变。
* 另外当i=j这过程一定正好是i+或j-完成的最后令循环结束。)
*/

 1 public class speedSort {
 2 public static void sort(int[] data) {
 3 quickSort(data, 0, data.length - 1);
 4 }
 5 
 6 private static void quickSort(int[] data, int i, int j) {
 7 int pivotIndex = (i + j) / 2;
 8 // swap
 9 swap(data, pivotIndex, j);//交换位置
10 
11 int k = partition(data, i - 1, j, data[j]);
12 swap(data, k, j);//交换位置
13 if ((k - i) > 1)
14 quickSort(data, i, k - 1);//交换位置
15 if ((j - k) > 1)
16 quickSort(data, k + 1, j);//交换位置
17 
18 }
19 
20 /**
21 * @param data
22 * @param i
23 * @param j
24 * @return
25 */
26 private static int partition(int[] data, int l, int r, int pivot) {
27 do {
28 while (data[++l] < pivot)
29 ;
30 while ((r != 0) && data[--r] > pivot)
31 ;
32 swap(data, l, r);//交换位置
33 } while (l < r);
34 swap(data, l, r);//交换位置
35 return l;
36 }
37 public static void main(String[] args) {
38 int[] arr = { 2, 5, 3, 1, 4 };
39 System.out.println("排序前:" + Arrays.toString(arr));
40 // InsertSort.sort(arr);
41 // BubbleSort.sort(arr);
42 // SelectionSort.sort(arr);
43 // ShellSort.sort(arr);
44 sort(arr);
45 // MergeSort.sort(arr);
46 // HeapSort.sort(arr);
47 System.out.println("排序后:" + Arrays.toString(arr));
48 }
49 
50 /*
51 * 交换数组中的两个元素
52 */
53 public static void swap(int[] data, int i, int j) {
54 int temp = data[i];
55 data[i] = data[j];
56 data[j] = temp;
57 }
58 
59 
60 }
posted @ 2018-07-25 23:38  雪人奥特曼  阅读(313)  评论(0编辑  收藏  举报