排序算法总结整理

各种排序算法的稳定性和时间复杂度小结  

目前不太清楚 :时间复杂度 考虑 比较 和 移动的问题,分开考虑? 

 

1. 冒泡排序的时间复杂度: 平均O(n2)        最坏O(n2)      最好O(n)                空间复杂度 O(1)           稳定,简单

package test;

public class Index {

	public static void main(String[] args) {
		
		int[] arr = {3,1,5,63,14,13,9,7,6,4,8};
		
		// 调用函数
		BobbSort(arr);
		
		for(int i = 0;i < arr.length;i++){
			System.out.print(arr[i]+",");
		}
	}
	/*
	 *	冒泡排序: 选择一个最大的数放到 后面 
	 * 		外循环: 循环多少次
	 * 		内循环:   循环的方式,从0开始,到 arr.length-i,结束
	 * */
	public static void BobbSort(int[] arr){
				
		if(arr == null || arr.length <2){
			return ;
		}
		   
		for(int i = 0;i < arr.length-1;i++){   // 因为涉及到比较操作,当倒数第二个数有序之后,最后一个数也是有序的。内循环需要多少次
			
			for(int j = 0;j < arr.length-i-1;j++){ // 获取所有未排序的 元素最大值,放到最右边,因为有j+1,所以j最大值length-1
				
				if(arr[j]>arr[j+1]){
					int temp = arr[j+1];
					arr[j+1] = arr[j];
					arr[j] = temp;
				}
			}
		}
	}
}	public static void main(String[] args) {
		
		int[] arr = {3,1,5,63,14,13,9,7,6,4,8};
		
		// 调用函数
		BobbSort(arr);
		
		for(int i = 0;i < arr.length;i++){
			System.out.print(arr[i]+",");
		}
	}
	/*
	 *	冒泡排序: 选择一个最大的数放到 后面 
	 * 		外循环: 循环多少次
	 * 		内循环:   循环的方式,从0开始,到 arr.length-i,结束
	 * */
	public static void BobbSort(int[] arr){
				
		if(arr == null || arr.length <2){
			return ;
		}
		   
		for(int i = 0;i < arr.length-1;i++){   // 因为涉及到比较操作,当倒数第二个数有序之后,最后一个数也是有序的。内循环需要多少次
			
			for(int j = 0;j < arr.length-i-1;j++){ // 获取所有未排序的 元素最大值,放到最右边,因为有j+1,所以j最大值length-1
				
				if(arr[j]>arr[j+1]){
					int temp = arr[j+1];
					arr[j+1] = arr[j];
					arr[j] = temp;
				}
			}
		}
	}
}

时间复杂度:(n-1)+(n-2)+...+2+1 = n*((n-1)+1)/2 = (n^2)/2   然后 /2忽略不计。所以是  n^2

 

2.快速排序的时间复杂度: 平均O(nlog2n)    最坏O(n2)   最好O(nlog2n)       空间复杂度 O(log2n)   不稳定,较复杂

package test;

public class Index {

	public static void main(String[] args) {
		
		int[] arr = {20,18,5,63,14,3,9,7,39,48,8};
		
		// 调用函数
		fastSort(arr, 0, arr.length-1);
		
		for(int i = 0;i < arr.length;i++){
			System.out.print(arr[i]+",");
		}
	}
	/*
	 * 快速排序:将一个数组队列  一分为二
	 *     内部实现采用了 递归
	 * */
	public static void fastSort(int[] arr,int low,int high){
		
		int l = low;
		int h = high;
		int key = arr[low];
		
		while(l < h){   // 当满足时,才做操作
			// 向 末尾看
			while(l < h && key <= arr[h]){  // 内部有 自减操作,所以要时刻检测
				h--;
			}
			if(key > arr[h]){
				arr[l] = arr[h]; 		// 填坑
				l++;
			}
			// 向 开始看
			while(l < h && key >= arr[l]){  // 内部有 自增操作,所以要时刻检测
				l++;
			}
			if(key < arr[l]){			// 填坑
				arr[h] = arr[l];
				h--;
			}
		}
		arr[l] = key;		// 中间值归位,一次快排完成
		
		for(int i = 0;i < arr.length;i++){
			System.out.print(arr[i]+",");
		}
		System.out.println();
		
		if(l > low) fastSort(arr, low, l-1); // 先执行,完成之后再向下一步
		if(h < high) fastSort(arr, l+1, high);
	}	
}	public static void main(String[] args) {
		
		int[] arr = {20,18,5,63,14,3,9,7,39,48,8};
		
		// 调用函数
		fastSort(arr, 0, arr.length-1);
		
		for(int i = 0;i < arr.length;i++){
			System.out.print(arr[i]+",");
		}
	}
	/*
	 * 快速排序:将一个数组队列  一分为二
	 *     内部实现采用了 递归
	 * */
	public static void fastSort(int[] arr,int low,int high){
		
		int l = low;
		int h = high;
		int key = arr[low];
		
		while(l < h){   // 当满足时,才做操作
			// 向 末尾看
			while(l < h && key <= arr[h]){  // 内部有 自减操作,所以要时刻检测
				h--;
			}
			if(key > arr[h]){
				arr[l] = arr[h]; 		// 填坑
				l++;
			}
			// 向 开始看
			while(l < h && key >= arr[l]){  // 内部有 自增操作,所以要时刻检测
				l++;
			}
			if(key < arr[l]){			// 填坑
				arr[h] = arr[l];
				h--;
			}
		}
		arr[l] = key;		// 中间值归位,一次快排完成
		
		for(int i = 0;i < arr.length;i++){
			System.out.print(arr[i]+",");
		}
		System.out.println();
		
		if(l > low) fastSort(arr, low, l-1); // 先执行,完成之后再向下一步
		if(h < high) fastSort(arr, l+1, high);
	}	
}

 

 

 

 

3. 选择排序的时间复杂度:  平均O(n2)       最坏O(n2)     最好O(n2)                 空间复杂度 O(1)           不稳定,简单

package test;

public class Index {

	public static void main(String[] args) {
		
		int[] arr = {3,1,5,63,14,1,9,7,6,4,8};
		
		// 调用函数
		selectSort(arr);
		for(int i = 0;i < arr.length;i++){
			System.out.print(arr[i]+",");
		}
	}
	/*
	 * 选择排序 : 选出最小的数 放到 最左边。
	 * 		外循环: 确定从哪里开始循环
	 * 		内循环: 依次遍历后续数组
	 * */
	public static void selectSort(int[] arr){
		
		for(int i = 0;i < arr.length-1;i++){      // 选择应该 被排序的位置,
      
			for(int j = i+1;j < arr.length;j++){  // 依次遍历后续数组,做比较
				
				if(arr[i]>arr[j]){
					int temp = arr[j];
					arr[j] = arr[i];
					arr[i] = temp;
				}
			}
		}
	}
}	

 

 

4. 插入排序的时间复杂度: 平均O(n2)        最坏O(n2)      最好O(n)                  空间复杂度 O(1)           稳定,简单

 

package test;

public class Index {

	public static void main(String[] args) {
		
		int[] arr = {20,18,5,63,14,3,9,7,39,48,8};
		// 调用函数
		BobbSort(arr);
		
		for(int i = 0;i < arr.length;i++){
			System.out.print(arr[i]+",");
		}
	}
	/*
	 * 插入排序:拿一个数插入到 已经排好顺序的 队列中
	 *     外循环: 获取 某一个数
	 * 	         内循环: 后移,并插入
	 * */
	public static void insertSort(int[] arr){
		
		if(arr == null || arr.length<2){
			return ;
		}
		
		for(int i = 1;i < arr.length;i++){   // 默认arr[0]为有序,从arr[1]开始取数据
			
			for(int j = i+1;j > 0;j--){		// 从已排序队列  末尾,向前比较,如果小于交换位置,大于
				
				if(arr[j]>=arr[j-1]){
					break;
				}
				if(arr[j]<arr[j-1]){
					int temp = arr[j];
					arr[j] = arr[j-1];
					arr[j-1] = temp;
				}
			}
		}
	}
}	public static void main(String[] args) {
		
		int[] arr = {20,18,5,63,14,3,9,7,39,48,8};
		// 调用函数
		BobbSort(arr);
		
		for(int i = 0;i < arr.length;i++){
			System.out.print(arr[i]+",");
		}
	}
	/*
	 * 插入排序:拿一个数插入到 已经排好顺序的 队列中
	 *     外循环: 获取 某一个数
	 * 	         内循环: 后移,并插入
	 * */
	public static void insertSort(int[] arr){
		
		if(arr == null || arr.length<2){
			return ;
		}
		
		for(int i = 1;i < arr.length;i++){   // 默认arr[0]为有序,从arr[1]开始取数据
			
			for(int j = i+1;j > 0;j--){		// 从已排序队列  末尾,向前比较,如果小于交换位置,大于
				
				if(arr[j]>=arr[j-1]){
					break;
				}
				if(arr[j]<arr[j-1]){
					int temp = arr[j];
					arr[j] = arr[j-1];
					arr[j-1] = temp;
				}
			}
		}
	}
}

 

 

选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,

冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值