韓順平 java筆記 第17講 第18講 排序 查找

1.排序分類數組

  (1)內部排序ui

    交換式排序  選擇式排序 (選擇排序法、堆排序法)插入式排序排序

  (2)外部排序遞歸

    合併排序 直接合並排序法class

2.交換式排序select

  (1)冒泡排序二叉樹

    79  56  90  4  32  27  16  88  35 方法

    90  79  56  88  4  32  27  16  35 數據

    90  88  79  56  35  4  32  27  16sort

    90  88  79  56  35  32  4  27  16

              90  88  79  56  35  32  27  4  16

    90  88  79  56  35  32  27  16  4

              90  88  79  56  35  32   27  16  4

    public class Demo{

      public static void main(String[] args){

        int arr[] = {1,6,0,-1,9,-100,90};

        Bubble bubble = new Bubble();

        bubble.sort(arr);

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

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

        }

      }    

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

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

      }

    }

    class Bubble{

      public void Sort(int arr[]){

        int temp = 0;

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

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

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

               temp = arr[j];

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

               arr[j+1] = temp;

            }

          }

        }

      }

    }

  (2)快速排序法

    基本思想:經過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的數據都比另一部分的全部數據小,而後按此方法對這兩部分數據分別進行快速排序,整個排序過程能夠遞歸進行。

   class QuickSort{

    public void sort(int left,int right,int[] array){

      int l = left;

      int r = right;

      int pivot = array[(left+right)/2];

      int temp= 0;

      while(l<r){

        while(array[1] < pivot)  l++;

        while(array[r] > pivot) r--;

        if(l>=r) break;

        temp = array[1];

        array[1] = array[r];

        array[r] = temp;

        if(array[1] == pivot)  --r;

        if(array[r] == pivot)  ++l;

      }

      if (l==r){

        l++;r--;

      }

      if(left < r) sort(left,r,array);

      if(right >1) sort(l,right,array);

    }

   }

3.選擇式式排序

  8  3  2  1  7  4  6  5 

  1  3  2  8  7  4  6  5

  1  2  3  8  7  4  6  5

  1  2  3  8  7  4  6  5

  1  2  3  4  8  7  6  5

  1  2  3  4  7  8  6  5

  1  2  3  4  5  8  6  7

  1  2  3  4  5  6  8  7

  1  2  3  4  5  6  7  8

  Select select = new Select();

  select.sort(arr1);

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

    System.out.println(arr1[i] + "  ");

  }

  class Select{

    public void Sort(int arr[]){

      int temp = 0;

      for(int j = 0;j<arr.length-1;j++){

        int min = arr[j];

        int minIndex = j;

        for(int k=j+1;k<arr.length;k++){

          if(min > arr[k]){

            min = arr[k];

            minIndex = k;

          }

        }

        temp =arr[j];

        arr[j] = arr[minIndex];

        arr[minIndex] = temp;

      }

    }

4.插入式排序

  (1)插入排序法

   基本思想:把n個待排序的元素當作爲一個有序表和一個無序表,開始時有序表中只包含一個元素,無序表中包含n-1個元素,排序過程當中,每次從無序表中取出第一個元素,把他的排序碼依次與有序表元素的排序碼進行比較,將他插入到有序表中的適當位置,使之成爲新的有序表。

  17  3  25  14  20  9

  3  17  25  14  20  9

  3  17  25  14  20  9

  3  14  17  25  20  9

  3  14  17  20  25  9

  3   9  14  17  20  25

  class InsertSort{

    public void sort(int arr[]){

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

        int insertVal = arr[i];

        int index = i-1;

        while(index>=0&&insertVal < arr[index]){

          arr[index + 1]  = arr[index];

          index --;

        }

        arr[index + 1] = insertVal;

      }

    }

  }

  (2)希爾排序法

  (3)二叉樹排序法

5.查找

  (1)順序查找

  (2)二分查找

    思路:找到數組的中間數(midVal),和你要查找的數finalVal進行比較,若是midVal>findVal,則說明findVal在數的左邊,就把該數組二分。

  class BinaryFind{

    public void find (int leftIndex,int rightIndex,int val,int arr[]){

      int midIndex = (rightIndex+leftIndex)/2;

      int midVal = arr[midIndex];

      if(rightIndex >= leftIndex){

        if(midVal > val){

          find (leftIndex,midIndex-1,val,arr);

        }else if (midVal <val){

          find (midIndex +1,rightIndex,val,arr);

        }else if (midVal == val){

          System.out.println(「找到下標」+midIndex);

        }

      }

    }

   }

相關文章
相關標籤/搜索