java中冒泡排序及其优化,选择排序,快速排序

简单选择排序的基本思想
给定数组:int[] arr={里面 n 个数据};第 1 趟排序,在待排序数据 arr[1]~arr[n]中选出最小的数据,将它与 arrr[1]交 换;第 2 趟,在待排序数据 arr[2]~arr[n]中选出最小的数据,将它与 r[2]交 换;以此类推,第 i 趟在待排序数据 arr[i]~arr[n]中选出最小的数据,将它与r[i]交换,直到全部排序完成

快速排序
快速排序的原理:选择一个关键值作为基准值。比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边(一般是无序的)。一般选择序列的第一个元素。
快速排序的实现:
一次循环:从后往前比较,用基准值和最后一个值比较,如果比基准值小的交换位置,如果没有继续比较下一个,直到找到第一个比基准值小的值才交换。找到这个值之后,又从前往后开始比较,如果有比基准值大的,交换位置,如果没有继续比较下一个,直到找到第一个比基准值大的值才交换。直到从前往后的比较索引>从后往前比较的索引,结束第一次循环,此时,对于基准值来说,左右两边就是有序的了。接着分别比较左右两边的序列,重复上述的环。

例如: 数组 int[] arr={5,2,8,4,9,1};
第一趟排序:选 5 为关键字,low=0,high=5
从 high 开始由,后向前找,找到比 5 小的第一个数 a[5]=1,进行替换
排序结果为:1 2 8 4 9 5
从 low 开始向后搜索,找到比 5 小的,交换1 2 5 4 9 8
从 high 开始由,后向前找,找到比 5 小,交换 1 2 4 5 9 8
直至 low 与 high 相遇重合,
第一趟排序结束以关键字为界,分成左右两个子序列,左边都比 5 小,右边都比 5 大
排序结果:
 1 2 4 5 9 8
 
 第二趟排序:
 以相同的方式排序左子序列 1 2 4选 1 为关键字 ,low=0,high=2 从 high 开始由,后向前找,找到比 1 小,没有,直至 low 与 high 相遇重合,第二趟排序结束
第二趟以 1 为界,将左子序列分为两个序列,左边没有数据,右边 2,4 两个序列
排序结果: 1 2 4 5 9 8
以相同的方式排序子序列
2 4
选 2 位关键字 ,low=1,high=2 从 high 开始由,后向前找,找到比 2 小,没有,直至 low 与 high 相遇重合,第三趟排序结束

第三趟以 2 为界,将子序列分为两个序列,左边没有数据,右边 4 两个序列排序结果: 1 2 4 5 9 8

第四趟排序:
以相同的方式排序子序列9,8 选 9 位关键字 ,low=4,high=5 从 high 开始由后向前找,找到比 9 小,交换 8,9 
第四趟以 9 为界,将子序列分为两个序列,左边 8,右边没有数据

排序结果: 1 2 4 5 8 9
快速排序是递归思想,可以采用递归的方式进行排序

/**
 * 
 */
package com.gem.demo.day04_practice;

/**
 *
 * Description:
 *
 * @author HadwinLing
 *
 * @date 2020年1月14日下午8:36:22
 *
 * @version 0.0.1 
 *
 */
public class Sort {
	/*
	  * 冒泡排序
	 * 
	 * */
	public static int[] BubbleUpSort(int[] arry) {//冒泡升序
		for(int i=0;i<arry.length;i++) {
			for(int j =0;j<arry.length-i-1;j++) {
				if(arry[j]>arry[j+1]) {
					int temp =arry[j];
					arry[j] = arry[j+1];
					arry[j+1] = temp;
				}
			}
		}
		return arry;
	}
	/*
	   *  选择排序
	 * 
	 * */
	public static int[] selectSort(int[] arry) {
		for(int i =0;i<arry.length-1;i++) {
			int k =i;
			for(int j =k+1;j<arry.length;j++) {
				if(arry[j]<arry[k]) {
					k=j;//记录目前找到最小值所在的位置
				}
			}
			if(i!=k) {
				int temp =arry[i];
				arry[i]= arry[k];
				arry[k]= temp;
			}
		}
		return arry;
	}
	/*
	   * 快速排序
	 * 
	 * */
	public static int[] quickSort(int a[],int low,int high) {
		int start = low;
		int end= high;
		int key = a[low];
		while(end>start) {
			//从后往前比较
			//如果没有比关键值小的,比较下一个,知道有比关键值小的交换位置,然后又从前往后比较
			while(end>start) {
				end--;
				if(a[end]<=key) {
					int temp = a[end];
					a[end] = a[start];
					a[start] = temp;
				}
				//从前往后比较
				while(end>start&&a[start]<=key) {//如果没有比关键值答的,比骄傲下一个,直到有比关键值答的交换位置
					start++;
					if(a[start]>=key) {
						int temp =a[start];
						a[start] = a[end];
						a[end] = temp;
					}
				}
				//此时第一次循环比较哦啊结束,关键值的位置已经确定了,左边的值都比关键值小,右边的值都比关键值大,但是两边的孙旭还有可能是不一样的,进行下面的递归调用
				if(start>low) {
					quickSort(a,low,start-1);
				}
				if(end<high) {
					quickSort(a,end+1,high);
				}
			}
		}
		return a;
	}

}

冒泡排序的优化

package com.hadwinling.learn;

import java.util.Arrays;

/**

* Title: TestBubbleSort.java

* Description: 冒泡排序及优化

* @author HadwinLing

* @date 2020年1月29日

* @version 1.0

*/
public class TestBubbleSort {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		 int[] values = { 3, 1, 6, 2, 9, 0, 7, 4, 5, 8 };
	        bubbleSort(values);
	        System.out.println(Arrays.toString(values));

	}
	 public static void bubbleSort(int[] values) {
	        int temp;
	        int i;
	        // 外层循环:n个元素排序,则至多需要n-1趟循环
	        for (i = 0; i < values.length - 1; i++) {
	            // 定义一个布尔类型的变量,标记数组是否已达到有序状态
	            boolean flag = true;
	    /*内层循环:每一趟循环都从数列的前两个元素开始进行比较,比较到无序数组的最后*/
	            for (int j = 0; j < values.length - 1 - i; j++) {
	                // 如果前一个元素大于后一个元素,则交换两元素的值;
	                if (values[j] > values[j + 1]) {
	                    temp = values[j];
	                    values[j] = values[j + 1];
	                    values[j + 1] = temp;
	                       //本趟发生了交换,表明该数组在本趟处于无序状态,需要继续比较;
	                    flag = false;
	                }
	            }
	           //根据标记量的值判断数组是否有序,如果有序,则退出;无序,则继续循环。
	            if (flag) {
	                break;
	            }
	        }
	    }
}

发布了42 篇原创文章 · 获赞 12 · 访问量 6104

猜你喜欢

转载自blog.csdn.net/Alingyuzi/article/details/103979769
今日推荐