欢迎光临散文网 会员登陆 & 注册

几种常见的排序算法原理以及代码实现

2023-06-15 11:35 作者:自由的莱纳  | 我要投稿

以下是几种常见的排序算法及其原理和代码实现:

1. 冒泡排序 (Bubble Sort)

冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

以下是 Java 代码实现:

```java  

public class BubbleSort {  

  public static void main(String[] args) {  

      int[] arr = {5, 2, 8, 4, 9, 1};  

      bubbleSort(arr);  

      for (int i = 0; i < arr.length; i++) {  

          System.out.print(arr[i] + " ");  

      }  

  }  

    

  public static void bubbleSort(int[] arr) {  

      int n = arr.length;  

      for (int i = 0; i < n-1; i++) {  

          for (int j = 0; j < n-i-1; j++) {  

              if (arr[j] > arr[j+1]) {  

                  int temp = arr[j];  

                  arr[j] = arr[j+1];  

                  arr[j+1] = temp;  

              }  

          }  

      }  

  }  

}

```

2. 插入排序 (Insertion Sort)

插入排序是一种简单的排序算法,它的思想是将未排序的元素一个一个地插入已排序好的序列中。在插入一个元素时,首先要找到该元素合适的位置,通常是在已排序好的序列的末尾。

以下是 Java 代码实现:

```java  

public class InsertionSort {  

  public static void main(String[] args) {  

      int[] arr = {5, 2, 8, 4, 9, 1};  

      insertionSort(arr);  

      for (int i = 0; i < arr.length; i++) {  

          System.out.print(arr[i] + " ");  

      }  

  }  

    

  public static void insertionSort(int[] arr) {  

      int n = arr.length;  

      for (int i = 1; i < n; i++) {  

          int key = arr[i];  

          int j = i - 1;  

          while (j >= 0 && arr[j] > key) {  

              arr[j + 1] = arr[j];  

              j--;  

          }  

          arr[j + 1] = key;  

      }  

  }  

}

```

3. 快速排序 (Quick Sort)

快速排序是一种常用的排序算法,它采用分治的思想,选取一个基准值,将待排序序列划分为两个子序列,其中一个子序列的所有元素都小于基准值,另一个子序列的所有元素都大于等于基准值,然后对这两个子序列递归地进行快速排序。

以下是 Java 代码实现:

```java  

public class QuickSort {  

  public static void main(String[] args) {  

      int[] arr = {5, 2, 8, 4, 9, 1};  

      quickSort(arr, 0, arr.length - 1);  

      for (int i = 0; i < arr.length; i++) {  

          System.out.print(arr[i] + " ");  

      }  

  }  

    

  public static void quickSort(int[] arr, int left, int right) {  

      if (left < right) {  

          int pivotIndex = partition(arr, left, right);  

          quickSort(arr, left, pivotIndex - 1);  

          quickSort(arr, pivotIndex + 1, right);  

      }  

  }  

    

  private static int partition(int[] arr, int left, int right) {  

      int pivot = arr[left];  

      int i = left + 1;  

      int j = right;  

      while (i <= j) {  

          while (i <= j && arr[i] < pivot) {  

              i++;  

          }  

          while (i <= j && arr[j] >= pivot) {  

              j--;  

          }  

          if (i <= j) {  

              swap(arr, i, j);  

              i++;  

              j--;  

          }  

      }  

      swap(arr, left, j);  

      return j;  

  }  

    

  private static void swap(int[] arr, int a, int b) {    

   int temp = arr[a];    

   arr[a] = arr[b];    

   arr[b] = temp;    

}

```

4. 归并排序 (Merge Sort)

归并排序是一种分治思想的排序算法,它将待排序序列划分为两个子序列,一个子序列的所有元素都小于等于基准值,另一个子序列的所有元素都大于等于基准值,然后对这两个子序列递归地进行归并排序。

以下是 Java 代码实现:

```java  

public class MergeSort {  

   public static void main(String[] args) {  

       int[] arr = {5, 2, 8, 4, 9, 1};  

       mergeSort(arr, 0, arr.length - 1);  

       for (int i = 0; i < arr.length; i++) {  

           System.out.print(arr[i] + " ");  

       }  

   }  

     

   public static void mergeSort(int[] arr, int left, int right) {  

       if (left < right) {  

           int middle = (left + right) / 2;  

           mergeSort(arr, left, middle);  

           mergeSort(arr, middle + 1, right);  

           merge(arr, left, middle, right);  

       }  

   }  

     

   private static void merge(int[] arr, int left, int middle, int right) {  

       int n1 = middle - left + 1;  

       int n2 = right - middle;  

       int[] L = new int[n1];  

       int[] R = new int[n2];  

       for (int i = 0; i < n1; i++) {  

           L[i] = arr[left + i];  

       }  

       for (int j = 0; j < n2; j++) {  

           R[j] = arr[middle + 1 + j];  

       }  

       int i = 0;  

       int j = 0;  

       int k = left;  

       while (i < n1 && j < n2) {  

           if (L[i] <= R[j]) {  

               arr[k] = L[i];  

               i++;  

           } else {  

               arr[k] = R[j];  

               j++;  

           }  

           k++;  

       }  

       while (i < n1) {  

           arr[k] = L[i];  

           i++;  

           k++;  

       }  

       while (j < n2) {  

           arr[k] = R[j];  

           j++;  

           k++;  

       }  

   }  

}

```

5. 快速排序中的原地排序 (In-place Sort)

快速排序中的原地排序是一种高效的排序算法,它利用递归地将待排序序列划分为子序列,然后对子序列进行排序,最后将排序好的子序列合并。

以下是 Java 代码实现:

```java  

public class QuickSortInplace {  

   public static void main(String[] args) {  

       int[] arr = {5, 2, 8, 4, 9, 1};  

       quickSort(arr, 0, arr.length - 1, true);  

       for (int i = 0; i < arr.length; i++) {  

           System.out.print(arr[i] + " ");  

       }  

   }  

     

   public static void quickSort(int[] arr, int left, int right, boolean isLst) {  

       if (left < right) {  

           int pivotIndex = partition(arr, left, right);  

           quickSort(arr, left, pivotIndex - 1, isLst);  

           quickSort(arr, pivotIndex + 1, right, isLst);  

       }  

   }  

     

   private static int partition(int[] arr, int left, int right) {  

       int pivot = arr[left];  

       int i = left + 1;  

       int j = right;  

       while (i <= j) {  

           while (i <= j && arr[i] < pivot) {  

               i++;  

           }  

           while (i <= j && arr[j] >= pivot) {  

               j--;  

           }  

           if (i <= j) {  

               swap(arr, i, j);  

               i++;  

               j--;  

           }  

       }  

       swap(

arr, left, j);

return j;

}

private static void swap(int[] arr, int a, int b) {

int temp = arr[a];

arr[a] = arr[b];

arr[b] = temp;

}

}


几种常见的排序算法原理以及代码实现的评论 (共 条)

分享到微博请遵守国家法律