Java实现五种基本排序方式

1.冒泡排序

冒泡排序的主要思想就是将最大的数“沉底”,即每次循环将最大的放在数组最后一位,之后的循环依次将大数后置。

 * 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 
 * 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
 * 针对所有的元素重复以上的步骤,除了最后一个。  
 * 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。  
public void bubbleSort(int arr[]){
	int temp;
	for(int i=0;i<arr.length-1;i++){    //i循环的是次数
		for(int j=0;j<arr.length-1-i;j++){   //每次循环将大数放在最后一位,
			if(arr[j]>arr[j+1]){   //对相邻的数进行比较,将大数后置。
			temp = arr[j];
			arr[j] = arr[j+1];
			arr[j+1] = temp;
			}
		}
	}
}

2.选择排序

选择排序是在所有数据中,找到数值最小的数,将这个数置于数组的首位,在之后的循环中,依次将小数前置。

 * 在未排序序列中找到最小元素,存放到排序序列的起始位置 
 * 再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。  
 * 以此类推,直到所有元素均排序完毕。   
public void selectSort(int arr[]){
	int k,temp;
	for(int i=0;i<arr.length; i++){
	k = i;
		for(int j=i+1; j<arr.length; j++){   //重复循环比较以找到最小的数
			if(arr[k]>arr[j]){
					k=j;   //确定最小数的下标
				}
		}
		if(k != i){
		temp = arr[i];
		arr[i] = arr[k];
		arr[k] = temp;   //把小数前置
		}
	}
}

3.插入排序

插入排序可以将其想象为玩扑克牌,右手摸来的牌是无序的,而左手理好的的牌是有序的,将右手边无序的牌插入到有序的牌中,插入排序正是如此。

 * 从第一个元素开始,该元素可以认为已经被排序  
 * 取出下一个元素,在已经排序的元素序列中从后向前扫描  
 * 如果该元素(已排序)大于新元素,将该元素移到下一位置 
 * 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
 * 将新元素插入到该位置中 
 * 重复步骤2  
public void insertSort(int arr[]){
	for(int i=1;i<arr.length;i++){   //在第二个数开始遍历,把第一个数看作有序
	int temp = arr[i];
		for(int j=i-1;j>=0;j--){	 //通过for循环判断无序的数将要插入在数组中的位置
			if(temp<arr[j]){
				arr[j+1] = arr[j];   //将每一个比temp大的数右移一位
			}else{
				break;               //当有一个数比temp小时,跳出循环
			}
		}
		arr[j+1] = temp;             //插入数据
	}
}

4.快速排序

快速排序指的是,以一个数为基准,按照该基准数左面的数小于该数,右面的数大于该数的原则,每次循环将数组中的数排列。之后分别以该数左右两边的所有数为基准全部进行循环,最终得到排列好的结果。

 * 从数列中挑出一个元素,称为“基准”
 * 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分割之后,  
   该基准是它的最后位置。这个称为分割(partition)操作。
 * 递归地把小于基准值元素的子数列和大于基准值元素的子数列排序。 
public void quickSort(int arr[], int low, int high){
	int i, j, t, temp;
	if(low>high){
	return;
	}   //要求传入的值必须是low<high
	i = low;
	j = high;
	temp = arr[i];
	while(i != j){
		while(i<=j && temp<arr[j]){  //一定要让右边的j首先向左移动
		j--;	//每次j循环向左移动一位
		}
		while(i<j && temp>=arr[i]){
		i++;	//每次循环向右移动一位
		}
		if(i < j){   //如果满足条件则交换(小数左移,大数右移)
		t = arr[i];
		arr[i] = arr[j];
		arr[j] = t;
		}
	}
	if(i==j){
		arr[low] = arr[i];   //当i和j值相同,即该两个指针指向统一位置时,将i和j相等的位置交换
		arr[i] = temp;		 //将初始首位置的值赋值给“中间”位置
		}
	quickSort(arr, low, i-1);	//执行左半边的快速排列
	quickSort(arr, i+1, high);   //执行右半区的快速排列
}

5.希尔排序

希尔排序就是对直接插入排序的一个优化。现在有一个array,希尔排序就是设定一个增量step(0<step<array.length)。
先从array[0]开始,以step为增量的进行直接插入排序,直到数组末尾,然后从array[1]开始重复:
以step为增量的进行直接插入排序; 然后从array[1]开始重复…一直到array[n]。然后取一个小于上一步增量的新的增量(比如设置为step/2),
对前一个步骤的结果array进行遍历,直接插入排序…,再取小于上一步增量的新的增量,
重复进行:遍历,直接插入排序直到新的增量小于1之后再退出循环。
public class ShellSort {
	public void shellSort(int[] arr) {
		if(arr==null || arr.length<=1) {
			return;
		}
		int increaseNum = arr.length / 2;
		int temp;
		while(increaseNum>=1) {
			for(int i = increaseNum;  i < arr.length; i++) {
				temp = arr[i];   //temp保存当前arr[i]的值
				int j = i-increaseNum;  //j 是 i的上一周期的值
				while(j >= 0 && arr[j] > temp) {   //当排序在数列前的数大于数列后的数时,执行插入排序
					arr[j+increaseNum] = arr[j];
					j = j-increaseNum;
				}
				arr[j + increaseNum] = temp;
			}
			increaseNum = increaseNum/2;	//设置新的增量
		}
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
归并排序是一种经典的排序算法,它的基本思想是将待排序的序列不断地划分成更小的子序列,直到每个子序列只有一个元素,然后再将这些子序列两两合并,直到最终得到一个有序的序列。 在Java实现归并排序可以按照以下步骤进行: 1. 首先,定义一个递归函数mergeSort,该函数用于将待排序的数组划分成更小的子数组,并进行合并排序。 2. 在mergeSort函数中,首先判断数组的长度是否大于1,如果小于等于1,则无需排序,直接返回。 3. 如果数组长度大于1,则将数组划分成两个子数组,分别调用mergeSort函数对这两个子数组进行排序。 4. 接下来,定义一个merge函数,用于将两个已经排好序的子数组合并成一个有序的数组。 5. 在merge函数中,创建一个临时数组,用于存放合并后的结果。同时定义两个指针i和j,分别指向两个子数组的起始位置。 6. 比较两个子数组中的元素大小,将较小的元素放入临时数组中,并将对应指针后移一位。 7. 当其中一个子数组的元素全部放入临时数组后,将另一个子数组中剩余的元素依次放入临时数组中。 8. 最后,将临时数组中的元素复制回原数组的对应位置。 下面是Java代码实现归并排序的示例: ```java public class MergeSort { public static void mergeSort(int[] arr, int left, int right) { if (left >= right) { return; } int mid = (left + right) / 2; mergeSort(arr, left, mid); mergeSort(arr, mid + 1, right); merge(arr, left, mid, right); } public static void merge(int[] arr, int left, int mid, int right) { int[] temp = new int[right - left + 1]; int i = left; int j = mid + 1; int k = 0; while (i <= mid && j <= right) { if (arr[i] <= arr[j]) { temp[k++] = arr[i++]; } else { temp[k++] = arr[j++]; } } while (i <= mid) { temp[k++] = arr[i++]; } while (j <= right) { temp[k++] = arr[j++]; } for (int m = 0; m < temp.length; m++) { arr[left + m] = temp[m]; } } public static void main(String[] args) { int[] arr = {5, 2, 8, 3, 1}; mergeSort(arr, 0, arr.length - 1); for (int num : arr) { System.out.print(num + " "); } } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值