数据结构中最常见的排序算法-Java

版权声明:本文为博主原创文章,转载时请注明出处!谢谢 https://blog.csdn.net/qq_34783311/article/details/83688604

1.选择排序
a) 原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕。也就是:每一趟在n-i+1(i=1,2,…n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。基于此思想的算法主要有简单选择排序、树型选择排序和堆排序。(这里只介绍常用的简单选择排序)
b) 简单选择排序的基本思想:给定数组:int[] arr={里面n个数据};第1趟排序,在待排序数据arr[1]-arr[n]中选出最小的数据,将它与arrr[1]交换;第2趟,在待排序数据arr[2]-arr[n]中选出最小的数据,将它与r[2]交换;以此类推,第i趟在待排序数据arr[i]~arr[n]中选出最小的数据,将它与r[i]交换,直到全部排序完成。
具体代码实现:

public static int[] Select_Sort(int[] arr){
  for(int i=0;i<arr.length-1;i++){
   int k=i;
   for(int j=k+1;j<arr.length;j++) {
    if(arr[j]<arr[k]) {
        k=j;
     }
 }
   if (k!=i) {
    int temp=arr[i];
    arr[i]=arr[k];
    arr[k]=temp;
      } 
  }
  return arr;
 }

2.快速排序
快速排序的原理:选择一个关键值作为基准值。比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边(一般是无序的)。一般选择序列的第一个元素。
一次循环:从后往前比较,用基准值和最后一个值比较,如果比基准值小的交换位置,如果没有继续比较下一个,直到找到第一个比基准值小的值才交换。找到这个值之后,又从前往后开始比较,如果有比基准值大的,交换位置,如果没有继续比较下一个,直到找到第一个比基准值大的值才交换。直到从前往后的比较索引>从后往前比较的索引,结束第一次循环,此时,对于基准值来说,左右两边就是有序的了。
接着分别比较左右两边的序列,重复上述的循环。类似于左右递归。
具体代码实现:

//快速排序:找一基准,通过过这个基准值,比基准值大的放在基准值的左边,比基准值小的放在基准值的右边
 public static void Quick_Sort(int[] arr,int high,int low) {
     
   int start=low;
   int end=high;
   int key=arr[low];
   while(end>start) {
         while(end>start && arr[end]>key)
          end--;
         if(arr[end]<=key) {
          int temp=arr[end]; 
          arr[end]=arr[start];
          arr[start]=temp;
         }
         while(end>start && arr[start]<key)
                start++;
         if(arr[start]>=key) {
          int temp=arr[start];
          arr[start]=arr[end];
          arr[end]=temp;
         }
   }
   if (start>low)Quick_Sort(arr,start-1,low);
   if (end<high)Quick_Sort(arr,high,end+1);
 }

3.冒泡排序
原理:比较两个相邻的元素,将值大的元素交换至右端。
思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复第一趟步骤,直至全部排序完成。
第一趟比较完成后,最后一个数一定是数组中最大的一个数,所以第二趟比较的时候最后一个数不参与比较;
第二趟比较完成后,倒数第二个数也一定是数组中第二大的数,所以第三趟比较的时候最后两个数不参与比较;
依次类推,每一趟比较次数-1;
……
具体代码如下:

 //冒泡排序:相邻的两个元素进行比较,每一次都有一个元素落到了最终的位置
 public static void Bubble_Sort(int[] arr) {
  for(int i=0;i<arr.length-1;i++) {
   boolean flag=true;//主要是判断此轮循环是否有交换元素,如果没有,则跳出循环
   //减i的原因是冒泡排序每一次都有一个元素落到最终的位置,这样落到最终的位置的元素就可以不用再进行排序了
   for(int j=1;j<arr.length-i;j++) {
    if(arr[j-1]>arr[j]) {
     int temp=arr[j-1];
     arr[j-1]=arr[j];
     arr[j]=temp;
        flag=false;    
    }   
   }
   if(flag==true) {
    break;
   }
  }   
 }

还有其他的几种排序也会做相应的说明

猜你喜欢

转载自blog.csdn.net/qq_34783311/article/details/83688604