排序算法之----冒泡排序,插入排序,选择排序

1 冒泡排序

顾名思义:小的数一点一点向前冒,最终有序
时间复杂度:O(n^2)

public static void bubbleSort(int[] arr){
	if(arr == null || arr.length <2){
		return;
	}
	for(int i=arr.length-1; i>0; i--){
		for(int j=0; j<i; j++){
			if(arr[j] > arr[j+1]){
				swap(arr,j,j+1);
			}
		}
	}
}
public static void swap(int[] arr,int i,int j){
	arr[i] = arr[i] ^ arr[j];
	arr[j] = arr[i] ^ arr[j];
	arr[i] = arr[i] ^ arr[j];
}

2 插入排序

基本思想:每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置(从后向前找到合适位置后),直到全部插入排序完为止。
时间复杂度:O(n^2)

public static void insertSort(int[] arr){
  if(arr == null || arr.length < 2){
  	return;
  }
  for(int i=1; i<arr.length; i++){//默认第一位已排好序
  	for(int j=i-1;j>=0; j--){
  		if(arr[j] > arr[j+1]){
  			swap(arr,j,j+1);
  		}
  	}
  }
}
public static void swap(int[] arr,int i,int j){
  	arr[i] = arr[i] ^ arr[j];
  	arr[j] = arr[i] ^ arr[j];
  	arr[i] = arr[i] ^ arr[j];
  }

3 选择排序

基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。
时间复杂度:O(n^2)

public static void selectSort(int[] arr){
   	int size = arr.length;
   	
   	for(int i=0;i<size-1;i++){
   		int minIndex = i;//最小元素的位置
   		for(int j=i+1; j<size; j++){
   			if(arr[j]<arr[minIndex])
   				minIndex = j;
   		}
   		//交换两个数
   		swap(arr,i,minIndex);//注意此题i和minIndex存在相等的情况,此时若用异或来交换两个数会出错
   	}
   }
   public static void swap(int[] arr, int i, int j) {
   	int tmp = arr[i];
   	arr[i] = arr[j];
   	arr[j] = tmp;
   }

猜你喜欢

转载自blog.csdn.net/Felix_ar/article/details/83241565
今日推荐