java 常见的数组排序

冒泡排序

冒泡排序的原理十分简单:用数组的第一个元素和第二个元素进行比较,将大的放到后面,这个过程称为一次,。然后用第二个和第三个比较,大的放后面,以此类推,直到最后一个元素,这个过程称为一趟。在一趟结束后,最大的元素已经放在最后一位了,然后开始第二趟,第二趟结束后第二大的元素就被放到倒数第二个位置,就这样持续直到所有元素有序为止。那么下面使用代码实现:

	int arr[]  = {
    
    1,54,7,91,63,2,4,7};
		for (int i = 0; i < arr.length; i++) {
    
    
			for (int j = 0; j < arr.length-i-1; j++) {
    
    
				if(arr[j]>arr[j+1]){
    
    
					arr[j] = arr[j+1]^arr[j];
					arr[j+1] = arr[j+1]^arr[j];
					arr[j] = arr[j+1]^arr[j];
				}
			}
		}
		System.out.println(Arrays.toString(arr));

输出:
请添加图片描述

选择排序

选择排序的原理和冒泡排序差不多,不过冒泡排序是相邻两个元素比较,以此类推,而选择排序则是使用第一个元素和后面的其他元素挨个比较,将大的放到后面,然后使用第二个元素与后面的元素比较,大的放后面,以此类推最终达到有序。

int arr[]  = {
    
    1,54,7,91,63,2,4,7};
		for (int i = 0; i < arr.length; i++) {
    
    
			for (int j = i+1; j < arr.length; j++) {
    
    
				if(arr[i]>arr[j]){
    
    
					arr[i] = arr[j]^arr[i];
					arr[j] = arr[j]^arr[i];
					arr[i] = arr[j]^arr[i];
				}
			}
		}
		System.out.println(Arrays.toString(arr));

结果:
请添加图片描述

插入排序

插入排序的原理会比较麻烦,他是将第一个元素作为起始数组,不管这个元素是大还是小。然后用第二个元素与这个元素进行比较,如果比起始元素大,则放在起始元素之后,反之放在之前,组成一个有序集合,然后用其他元素跟有序集合中的元素比较,插入到正确的位置,以此类推达到有序。

int arr[]  = {
    
    1,54,7,91,63,2,4,7};
		for (int i = 0; i < arr.length; i++) {
    
    
			int b = arr[i];
			int c = i;
			while(c>0&& b<arr[c-i]){
    
    
				arr[c] = arr[--c];
			}
			if(c!=i){
    
    
				arr[c] =b;
			}
		}

结果:
请添加图片描述

二分查找

二分查找是一个具有前提的算法,前提就是必须这个数组是有序的,如果你是无序的要么你使用别的算法或者你排好序了再用
既然是二分查找首先我们先确定中间值,因为一半儿一半儿嘛(要不然咋叫二分查找), 中间值 = (开始元素的下标 + 结束元素的下标)/2
这时候把你输入的元素和这个中间值比较,如果大那就在右半部分,反之亦然

	System.out.println("请输入数字");
		int arr[] = {
    
    1,5,6,9,11,17,19,22,29,44,55,77,88,155,999};
		Scanner sc = new Scanner(System.in);
		int a = sc.nextInt();

		int start = 0;
		int end = arr.length-1;
		
		while (true) {
    
    
			int m = (start+end)/2;
			if(arr[m]>a){
    
    
				end = m-1;		
			}else if(arr[m]<a){
    
    
				start = m+1;
			}else {
    
    
				System.out.println("找到了"+","+m+"位");
				break;
			}
			if(start>end){
    
    
				System.out.println("没有这个数");
				break;
			}
			
		}

结果
请添加图片描述

部分排序法:使用Array.sort还可进行选择想要排序的部分数字,如将下角标编号为1~4的数字进行排序,其他数字顺序不变

public static void main(String[] args) {        
        int[] arr = {4,3,5,1,2,9,3,0};        
        Arrays.sort(arr,1,4);        
        for (int i = 0;i<arr.length;i++){
            System.out.print(arr[i]+",");
        }
    }

快速排序

快速排序是这四种排序中最复杂的,但在处理大量数据的排序时,快速排序却是效率最高的,他的原理很简单:先从一堆数据中挑选出一个基准数,然后将比这个基准数小的数据全部放在基准数的前面,将比他大的放在基准数后面,此时,不管前后,都是无序的,然后再分别在前后两组数据中挑出一个基准数,重复此操作,一直分下去,分成两部分、四部分、八部分。。。直到每一个数据的左边都比他小,右边都比他大,此时整个数组就是有序的了。


public static void QuickSort(int[] arr, int start,int end ){
        if(start<end){
            int index=getIndex(arr,start,end);//定义getIndex方法传入参数
 
            QuickSort(arr,start,index-1);//使用递归的方法,对基准数左边部分进行递归
 
            QuickSort(arr, index+1, end);//对右边部分递归
        }
    }
 
    private static int getIndex(int[] arr, int start, int end) {
        int i=start;
        int j=end;
        //定义一个基准数
        int x=arr[i];
        while (i<j){
            //从后往前找比他小的数的下标。
            while (i < j&&arr[j]>x) {
                j--;              //如果比他大则向前移动,直到找到小的为止。
            }
            //将找到的数填到上一个数的位置。
            if (i < j) {
                arr[i] = arr[j];
                i++;
            }
            //从前往后找比他大于等于的数的下标。
            while (i < j && arr[i]<= x) {
                i++;
            }
            if (i < j) {
                arr[j] = arr[i];
                j--;
            }
        }
 
        arr[i]=x;
        return i;
 

}

希尔排序

希尔排序的思想:
首先它把较大的数据集合分割成若干个小组(逻辑上分组),然后对每一个小组分别进行插入排序。

//将整个数组分为若干个子数组
        //遍历各组的元素
        //交换元素
        int a[] = {3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48};
        for (int gap = a.length / 2; gap > 0; gap = gap / 2) {
            for (int i = gap; i < a.length; i++) {
                for (int j = i - gap; j >= 0; j = j - gap) {
                    if (a[j] > a[j + gap]) {
                        int temp = a[j];
                        a[j] = a[j + gap];
                        a[j + gap] = temp;
                    }
                }
            }
        }

猜你喜欢

转载自blog.csdn.net/qq_45256777/article/details/127308415