算法培训(一)---排序算法

排序算法有很多种,一个算法的好坏主要看它的空间复杂度和时间复杂度,而很多时候,我们不会在意空间复杂度,因为我们现在的计算机内存非常大,不用在意这一点空间的消耗。下面说一下几种常用的排序算法。
冒泡排序,选择排序,插入排序,鸡尾酒排序,希尔排序,快速排序(填坑法,双指针法)

  • 冒泡排序

      package 算法第一节;
      //冒泡排序
      public class Sort1 {
      	public static void main(String[] args){
      		int [] a = {6,8,1,9,7,5,3,2,10,4};
      		sort(a);
      		for(int i=0;i<10;i++)
      		{
      			System.out.println(" "+a[i]);
      		}
      	}
      	public static void sort(int a[])
      	{
      		for(int i=0;i<10;i++)
      		{
      			for(int j=0;j<10-i-1;j++)
      			{
      				if(a[j]>a[j+1])
      				{
      					int temp=0;
      					temp = a[j];
      					a[j] = a[j+1];
      					a[j+1] = temp;
      				}
      			}
      		}
      	}
      }
    
  • 选择排序

      package 算法第一节;
      //选择排序
      public class Sort2 {
      	public static void main(String[] args){
      		int [] a = {6,8,1,9,7,5,3,2,10,4};
      		for(int i=0;i<10;i++)
      		{
      			int min=i;
      			for(int j=i+1;j<10;j++)
      			{
      				if(a[min]>a[j])
      				{
      					min = j;
      				}
      			}
      			swap(a,min,i);
      			System.out.println(a[i]);
      		}
      	}
      	public  static void swap(int a[],int min,int i)
      	{
      		int temp;
      		temp = a[min];
      		a[min] = a[i];
      		a[i]=temp;
      	}
      }
    
  • 插入排序

      package 算法第一节;
      //插入排序
      public class Sort3 {
      	public static void main(String[] args){
      		int [] a = {6,8,1,9,7,5,3,2,10,4,2,2,0,6,52,26,2,03,6,1};
      		for(int i=0;i<a.length;i++)
      		{
      				for(int j=i;j>0&&a[j]<a[j-1];j--) 
      				{
      					swap(a,j,j-1);
      				}
      		}
      		for(int i=0;i<a.length;i++)
      		{
      			System.out.println(a[i]);
      		}
      	}
      	public static void swap(int a[],int m,int n)
      	{
      		int temp;
      		temp = a[m];
      		a[m] = a[n];
      		a[n] = temp;
      	}
      }
    
  • 鸡尾酒排序

      package 算法第一节;
      //鸡尾酒排序法
      public class Sort4 {
      	public static void main(String[] arg){
      		int [] a = {6,8,1,9,7,5,3,2,10,4};
      		sort(a);
      		for(int i=0;i<10;i++)
      		{
      			System.out.println(" "+a[i]);
      		}
      	}
      	public static void sort(int a[])
      	{
      		int start = 0;
      		int end = 9;
      		while(start<end)
      		{
      			for(int j=start;j<end;j++)
      			{
      				if(a[j]>a[j+1])
      				{
      					int temp=0;
      					temp = a[j];
      					a[j] = a[j+1];
      					a[j+1] = temp;
      				}
      			}
      			end--;
      			for(int j=end;j>start;j--)
      			{
      				if(a[j]<a[j-1])
      				{
      					int temp=0;
      					temp = a[j];
      					a[j] = a[j-1];
      					a[j-1] = temp;
      				}
      			}
      			start++;
      		}
      	}
      }
    
  • 希尔排序

      package 算法第一节;
      //希尔排序
      public class Sort5 {
      	public static void main(String[] arg){
      		int [] a = {9,5,7,4,1,6,3,0,2,8};
      		sort5(a);
      		for(int i=0;i<a.length;i++)
      		{
      			System.out.println(a[i]);
      		}
      	}
      	public static void sort5(int []a) {
      		int gap = a.length/2;
      		while(gap>=1) {
      			for(int i=gap;i<a.length;i++) {
      				int temp = a[i];
      				int j = i-gap;
      				while(j>=0&&temp<a[j])
      				{
      					a[j+gap]=a[j];
      					j = j - gap;
      				}
      				a[j+gap] = temp;
      			}
      			gap/=2;
      		}
      	}
      //	public static void swap(int a[],int m,int n)
      //	{
      //		int temp;
      //		temp = a[m];
      //		a[m] = a[n];
      //		a[n] = temp;
      //	}
      }
    
  • 快速排序—填坑法

      package 算法第一节;
      //快速排序---填坑法
      public class Sort6 {
      	public static void main(String[] arg){
      		int [] a = {8,2,1,5,7,9,0,3,4,6};
      		int start=0;
      		int end=a.length-1;
      		quickSort(a,start,end);
      		for(int i=0;i<a.length;i++)
      		{
      			System.out.println(a[i]);
      		}
      		
      	}
      public static int Partition(int [] a,int start,int end)
      {
      	int pivot = a[start];
      	while(start<end){
      		while(start<end&&pivot<a[end])
      			end--;
      		a[start] = a[end];
      		while(start<end&&pivot>=a[start])
      			start++;
      		a[end] = a[start];
      	}
      	a[start] = pivot;
      	return start;
      }
      public static void quickSort(int [] a,int start,int end)
      {
      	if(start<end)
      	{
      		int pos = Partition(a,start,end);
      		quickSort(a,start,pos-1);
      		quickSort(a,pos+1,end);
      	}
      }
      }
    
  • 快速排序—双指针法

      package 算法第一节;
      //快速排序---双指针法 
      public class Sort7 {
      	public static void main(String[] arg){
      		int [] a = {8,2,1,5,7,9,0,3,4,6};
      		int start=0;
      		int end=a.length-1;
      		quickSort(a,start,end);
      		for(int i=0;i<a.length;i++)
      		{
      			System.out.println(a[i]);
      		}
      	}
      	    public static void quickSort(int[] arr, int start, int end) {
      	        if (start >= end) {
      	            return;
      	        }
      	        //基准位置默认地一个元素
      	        int pivot = arr[start];
      	        int left = start;
      	        int right = end;
       
              while (right > left) {
                  //右指针循环左移
                  while (left < right && arr[right] > pivot) {
                      right--;
                  }
       
                  //左指针循环右移
                  while (left < right && arr[left] <= pivot) {
                      left++;
                  }
                  if(left<right){
                      int tem = arr[left];
                      arr[left] = arr[right];
                      arr[right] = tem;
                  }
              }
              //基准位置与重合时left与right交换
              int tem = arr[left];
              arr[left]  = pivot;
              arr[start] = tem;
              quickSort(arr, start, left - 1);
              quickSort(arr, left + 1, end);
          }
      }
    

测试多组数组排序,几种方法出现了差异。测试时随机数的产生也会影响测试时间。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值