基础算法——排序与查找(复杂度)

1. 数字排序
1.1 算法——冒泡算法

//相邻
public class Suan{
	public static void main(String []args){
		int[] ary={1,2,3,4,5,9,6,7,8};
		//遍历,依次相邻比较大小
		for(int i=0;i<ary.length-1;i++){
			for(int j=0;j<ary.length-i-1;i++){
				if(ary[j]>ary[j+1]){
				int y=ary[j];ary[j]=ary[j+i];ary[j+1]=t;
				}
			}
		}
		//打印排序后的数组内容
		System.out.println("排序后的数组:"+Arrays.toString(ary));
	}
}
C:\Users\o2o\aa>javac Suan.java

C:\Users\o2o\aa>java Suan
排序后的数组:[1, 2, 3, 4, 5, 6, 7, 8, 9]

1.2 算法——选择排序

//跟第一个比
import java.util.Arrays;
public class Suan{
		public static void mian(String[] args){
			int[] ary = {1,2,3,4,5,9,6,7,8};
			for(int i=0;i<ary.length-1;i++){
				for(int j=i+1;j<ary.length;j++){
					if(ary[i]>ary[j]){
						int t=ary[i];ary[i]=ary[j];ary[j]=t;
					}
				}
			}
			//打印排序后的数组内容
			System.out.println("排序后的数组:"+Arrays.toString(ary));
		}
}
C:\Users\o2o\aa>javac Suan.java

C:\Users\o2o\aa>java Suan
排序后的数组:[1, 2, 3, 4, 5, 6, 7, 8, 9]

1.3 算法——插入排序

import java.util.Arrays;
public class Suan {
	//前后部分
	public static void main (String[] args){
		int[] ary={1,2,3,4,5,9,6,7,8};
		int i,j,k;
		for(i=1;i<ary.length;i++){
			k=ary[i];//取出待插入元素
			//找到插入位置
			for(j=i-1;j>=0&&k<ary[j];j--){
			ary[j+1]=ary[j];//移动元素
			}
			//插入元素
			ary[j+1]=k;
		}
		//打印排序后的数组内容
		System.out.println("排序后的数组:"+Arrays.toString(ary));
		
	}
}
C:\Users\o2o\aa>javac Suan.java

C:\Users\o2o\aa>java Suan
排序后的数组:[1, 2, 3, 4, 5, 6, 7, 8, 9]

1.4 算法——快速排序

import java.util.Arrays;
public class Suan {
	//基准值递归调用
	public static void main(String[] args){
		int vec[]={77,88,66,100,10,55,55,99,9};
		Suan q = new Suan();
		q.quicksort(vec,0,vec.length-1);
		System.out.println("排序后的数组:"+Arrays.toString(vec));
	}
	public void quicksort(int a[],int low,int high){//假设传入low=0;high=a.l;
		
		if(low<high){
			int pivot,p_pos,i;//申明变量
			p_pos = low;//p_pos指向low,即位索引为0位置
			pivot = a[p_pos];//将0位置上的数值赋给pivot
			for(i=low+1;i<=high;i++){//循环次数,i=1
				if(a[i]>pivot){
				//1位置的数与0位置数作比较:a[1]>a[0]
					p_pos++;//2位与1位比较,3位与2位比较
					int tmp = a[p_pos];
					a[p_pos] = a[i];
					a[i] = tmp;					
				}				
			}
			int tmp = a[low];
			a[low] = a[p_pos];
			a[p_pos] = tmp;
			quicksort(a,low,p_pos-1);//递归调用,排序左半区
			quicksort(a,p_pos+1,high);//递归调用,排序右半区
		}
	}
}
C:\Users\o2o\aa>javac Suan.java

C:\Users\o2o\aa>java Suan
排序后的数组:[100, 99, 88, 77, 66, 55, 55, 10, 9]

1.5 算法——希尔排序

import java.util.Arrays;
public class Suan {
     public static void main(String args[]){
         int []ary ={1,4,2,7,9,8,3,6};
         shellSort(ary);
         System.out.println("排序后的数组:"+Arrays.toString(ary));
         int []ary1 ={10,3,4,7,9,80,3,60};
         shellSort(ary1);
         System.out.println("排序后的数组:"+Arrays.toString(ary1));
     }
    //函数功能,希尔排序算法对数字递增排序
    //函数参数,数列起点,数列终点
     public static void shellSort(int ary[]){
		int index = ary.length/2;
		int temp=0;
		while(index>=1){
			for(int i=index;i<ary.length;i++){
				for(int j=i-index;j>=0;j-=index){
					if(ary[j]>ary[j+index]){
						temp = ary[j];
						ary[j] = ary[j+index];
						ary[j+index]=temp;
					}
				}
			}			
			index = index/2;
		}
	}
}

 排序后的数组:

C:\Users\o2o\aa>java Suan
排序后的数组:[1, 2, 3, 4, 6, 7, 8, 9]
排序后的数组:[3, 3, 4, 7, 9, 10, 60, 80]

2. 查找

2.1 算法——顺序查找

//跟第一个比
import java.util.Arrays;
public class OrderFind{
	public static void main(String[] args){
		//定义一段数组
		int[] ary = {1,2,3,4,5,6,9,7,8};
		//定义要查找的数据
		int find = 5;
		//定义标识(示)符,即找到的位置
		int count=-1;
		for(int i=0;i<ary.length;i++){
			if(find == ary[i]){
				count = i;
			}
		}
		if(count != 1){
			System.out.println("下标在:"+count+"的位置");
		}else{
			System,out.println("对不起,没有找到!");
		}
	}
}

下标在:3的位置 

2.2 算法——二分查找

//mid=(low+high)/2
import java.util.Arrays;
public class BinarySearchDemo{
	public static void main(String[] args){
		//定义一堆数据
		int[] a={1,2,3,4,5,6,9,7,8};
		//定义要查找的数据
		int value = 5;
		//定义标识(示)符,即找到的位置
		int count = -1;
		int low = 0;
		int high = a.length-1;
		while(low<=high){
			int mid = (low+high)/2;
			if(a[mid] == value){
				count = mid;
				break;
			}else if(a[mid]>value){
			high = mid-1;
			
			}else{
			low = mid+1;
			
			}
		}if(count != -1){
			System,out.println("下标在:"+count+"位置");
		}else{
			System.out.println("没有找到!");
		}
	}	
}

下标在:3的位置 

3. 复杂度

(1)

名称

稳定性

初始状态

      复杂度

      理想情况

   最差情况

  基本思想

       内存

简单选择

 

O(n2)

 

 

依次选择最小的数

 

冒泡排序

(flag=1)

 

O(n2)

大体符合排序要求

与排序要求完全相反

从后往前多次扫描

 

直接插入

 

O(n2)

初始有序

初始倒序

依次取出插入

 

堆排序

 

O(nlog2n)

带排序的数据较多

 

 

最少

快速排序

 

O(nlog2n)

 

n很小时

从两头向中间扫描

 

希尔(Shell)排序

 

n1.3

 

 

 

 

二路归并

 

O(nlog2n)

 

 

 

最多

基数排序

 

O(d(n+rd))

 

 

 

较多

(2) 

选堆快希----不稳定 

选堆归基----无关

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值