java 常用五种排序

来源:互联网 发布:侯捷 c stl源码解析 编辑:程序博客网 时间:2024/06/04 18:26
//冒泡排序
    //依次比较相邻的两个元素,通过一次比较把未排序序列中最大(或最小)的元素放置在未排序序列的末尾。
    public static void BubbleSort (int data[]) {  
        for (int i = 0; i < data.length -1; i++) {  
            for (int j = 0; j < data.length - i - 1; j++) {  
                if (data[j] > data[j + 1]) {  
                    int temp = data[j];  
                    data[j] = data[j + 1];  
                    data[j + 1] = temp;  
                }  
 
            }  
        }  
    }
    
    //选择排序
    /**
     每一次从待排序的数据元素中选出最小(或最大)的一个元素,
     顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
     **/
    public static void SelectionSort  (int data[]) {  
        int minVal;  
       int minIndex;  
       for (int i = 0; i < data.length - 1; i++) {  
           minVal = data[i];  
           minIndex = i;  
           for (int j = i + 1; j < data.length; j++) {  
               if (data[j] < minVal) {  
                   minVal = data[j];  
                   minIndex = j;  
               }  
           }  
           if (minVal != data[i] && minIndex != i) {  
               data[minIndex] = data[i];  
               data[i] = minVal;  
           }  
       }  
   }
    
    //插入排序
    /**
     将数列分为有序和无序两个部分,
     每次处理就是将无序数列的第一个元素与有序数列的元素从后往前逐个进行比较,
     找出插入位置,将该元素插入到有序数列的合适位置中。
     * **/
     public static void InsertionSort (int data[]) {  
            for (int i = 1; i < data.length; i++) {  
                for (int j = i; j > 0; j--) {  
                    if (data[j] < data[j - 1]) {  
                           int temp = data[j];  
                         data[j] = data[j - 1];  
                        data[j - 1] = temp;
                    }  
                }  
            }  
        }  
    
    
    
     //快速排序
     /**
      通过一趟排序将要排序的数据分割成独立的两部分,
     其中一部分的所有数据都比另外一部分的所有数据都小,
     然后再按此方法对这两部分数据分别进行快速排序,
     整个排序过程可以递归进行,以此达到整个数据变成有序序列。
     **/
     public static void Quicksort(int data[], int start, int end) {  
            if (end - start <= 0) {  
                return;  
            }  
            int last = start;  
            for (int i = start + 1; i <= end; i++) {  
                if (data[i] < data[start]) {  
                    int temp = data[++last];  
                    data[last] = data[i];  
                    data[i] = temp;  
                }  
            }  
            int temp = data[last];  
            data[last] = data[start];  
            data[start] = temp;  
            Quicksort(data, start, last - 1);  
            Quicksort(data, last + 1, end);  
        }  
    
     //归并排序
     /**
     将两个(或两个以上)有序表合并成一个新的有序表,
     即把待排序序列分为若干个子序列,每个子序列是有序的。
     然后再把有序子序列合并为整体有序序列。排序过程如下:
    (1)申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
    (2)设定两个指针,最初位置分别为两个已经排序序列的起始位置
    (3)比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
    (4)重复步骤3直到某一指针达到序列尾
     (5)将另一序列剩下的所有元素直接复制到合并序列尾
     **/
       public static void sort(int data[], int start, int end) {  
            if (start < end) {  
                int mid = (start + end) / 2;  
                sort(data, start, mid);  
                sort(data, mid + 1, end);  
                merge(data, start, mid, end);  
            }  
        }  
      
        public static void merge(int data[], int start, int mid, int end) {  
            int temp[] = new int[end - start + 1];  
            int i = start;  
            int j = mid + 1;  
            int k = 0;  
            while (i <= mid && j <= end) {  
                if (data[i] < data[j]) {  
                    temp[k++] = data[i++];  
                } else {  
                    temp[k++] = data[j++];  
                }  
            }  
      
            while (i <= mid) {  
                temp[k++] = data[i++];  
            }  
            while (j <= end) {  
                temp[k++] = data[j++];  
            }  
      
            for (k = 0, i = start; k < temp.length; k++, i++) {  
                data[i] = temp[k];  
            }  
        }
    
0 0
原创粉丝点击