zoukankan      html  css  js  c++  java
  • 几种常用排序

    选择排序:把第一个元素和其他元素依次对比,第一次比较完后 ,和最小的交换位置,即第一次最小的值出现在前面。然后第二个数和后面的进行比较 以此类推。(具体可参考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 }
  • 相关阅读:
    JavaScript 的数据类型及其检测
    编写JavaScript 代码的5个小技巧
    canvas标签的基本用法
    析构函数的调用------新标准c++程序设计
    类型转换构造函数 及使用explicit避免类型自动转换------新标准c++程序设计
    c++小知识
    this指针------新标准c++程序设计
    类的互相包含------新标准c++程序设计
    封闭类------新标准c++程序设计
    c++内存模型------计算机系统核心概念及软硬件实现
  • 原文地址:https://www.cnblogs.com/ysg520/p/9369024.html
Copyright © 2011-2022 走看看