排序法总结

冒泡排序法:

1、比较相邻的元素。如果第二个比第一个小,就交换他们两个。
2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。完成一次循环之后,最后面的数就是找到的最大的数,循环可以不再比较。
3、针对所有的元素重复以上的步骤,除了最后一个。
4、循环至所有元素都不需要改变顺序。

```java
public class Sort {
    public static void main(String[] args) {
        //冒泡排序
        int[] numbers=new int[]{23,2,34,5,64,72,30,98};
        int i,j;
        for(i=0;i<numbers.length-1;i++)
        {
            for(j=0;j<numbers.length-1-i;j++) //第i次执行内循环,最后面的i个元素的位置是确定的
            {
                if(numbers[j]>numbers[j+1])
                {
                    int temp=numbers[j];
                    numbers[j]=numbers[j+1];
                    numbers[j+1]=temp;
                }
            }
        }
        System.out.println("从小到大排序后的结果是:");
        for(i=0;i<numbers.length;i++)
            System.out.print(numbers[i]+" ");
    }
}

快速排序法:

1、在数组中任意确定一个基准值base,不妨取数组的第一个数
2、设定双指针,i 指针是头指针,j 是尾指针,i 指针从前往后,找到数组里面第一个比base大的值的位置,j 指针从后往前,找到第一个比base小的值的位置。
3、交换指针 i 和 j 指向的内容,交换完之后,指针 i 指向的内容比base小,指针 j 指向的内容比base大。
4、交换指针 i 的内容和base的位置,base归位,这样 i 的内容、base、j 的内容就从小到大排列,数组被base切分为两个部分。
5、对切分出来的两个部分重复上述操作(递归),如果得到头指针i小于尾指针j,这一部分的排序完成,返回。

public class quickSort {
	public static void main(String[] args) {
		int[] array=new int[]{23,2,34,5,64,72,30,98};
		quickSort(array);
		for(int i = 0;i<array.length;i++) {
			System.out.print(array[i]+"\t");
		}
		
	}
	/**
	 * 快速排序
	 * @param array
	 */
	public static void quickSort(int[] array) {
	    int len;
	    if(array == null  //非法矩阵
	            || (len = array.length) == 0
	            || len == 1) {
	        return ;
	    }
	    sort(array, 0, len - 1);
	}
	
	/**
	 * 快排核心算法,递归实现
	 * @param array
	 * @param left
	 * @param right
	 */
	public static void sort(int[] array, int left, int right) {
	    if(left > right) { //当上一次调用时只有一个数了,也就是left==right,再次调用就会出现这个情况
	        return;
	    }
	    // 不妨直接取数组的第一个数位base
	    int base = array[left];  
	    int i = left, j = right;
	    while(i != j) {
	        // 先从右边开始往左找,直到找到比base值小的数
	        while(array[j] >= base && i < j) {
	            j--;
	        }

	        // 再从左往右边找,直到找到比base值大的数
	        while(array[i] <= base && i < j) {
	            i++;
	        }

	        // 上面的循环结束表示找到了位置,交换两个数在数组中的位置
	        if(i < j) {
	            int tmp = array[i];
	            array[i] = array[j];
	            array[j] = tmp;
	        }
	    }

	    // 将基准数放到中间的位置(基准数归位)
	    array[left] = array[i];
	    array[i] = base;

	    // 递归,继续向基准的左右两边执行和上面同样的操作
	    // i的索引处为上面已确定好的基准值的位置,无需再处理
	    sort(array, left, i - 1);
	    sort(array, i + 1, right);
	}
}

归并排序:

1、将要排序的数组从中间分成两个数组,长度最多相差1.
2、将两个分出来的数组再次中中间分开,直至分成一个部分只有一个元素,不能再分了,开始一步步比较合并。
3、创建一个中间数组term[ ] ,长度这一步需要合并的两个数组长度这和(这一步中合并所有相邻的,长度相差最多为1的子数组)。
4、从两个数组中逐个拿小的那个元素放到term[ ]中,拿完之后term[ ]的元素的顺序都是排好的,然后覆盖到原数组的内容。
5、一步步往回合并,直到合并成原来数组长度的term[ ],覆盖原数组。

public class mergeSort {

    public static int[] sort(int[] nums, int low, int high) {  
        int mid = (low + high) / 2;  
        if (low < high) {  
            // 左边  
            sort(nums, low, mid);  
            // 右边  
            sort(nums, mid + 1, high);  
            // 左右归并  
            merge(nums, low, mid, high);  
        }  
        return nums;  
    }  
  
    public static void merge(int[] nums, int low, int mid, int high) {  
        int[] temp = new int[high - low + 1];  
        int i = low;// 左指针  
        int j = mid + 1;// 右指针  
        int k = 0;  
  
        // 把较小的数先移到新数组中  
        while (i <= mid && j <= high) {  
            if (nums[i] <= nums[j]) {  //看两边指针的内容,哪个小就哪个放进新数组
                temp[k++] = nums[i++];   //i和k 用完之后再自增
            } else {  
                temp[k++] = nums[j++];  
            }  
        }  
  
        // 如果是左边有剩余的数,就把左边剩余的数移入数组  
        while (i <= mid) {  
            temp[k++] = nums[i++];  
        }  
  
        // 如果是右边有剩余的数,就把右边边剩余的数移入数组  
        while (j <= high) {  
            temp[k++] = nums[j++];  
        }  
  
        // 把新数组中的数覆盖nums数组  
        for (int k2 = 0; k2 < temp.length; k2++) {  //排好序的内容覆盖原来的内容
            nums[k2 + low] = temp[k2];  
        }  
    }  
  
      
    // 归并排序的实现  
    public static void main(String[] args) {  
        
        int[] nums = {23,2,34,5,64,72,30,98};  
        mergeSort.sort(nums, 0, nums.length-1);  
        System.out.println(Arrays.toString(nums));  
    }  
} 

二分法查找:

用于查找升序序列中的元素:
1、3值指针,low,mid,high,low是数组的头指针,high是数组的尾指针,mid是数组的中间指针(mid=(low+high)/2)
2、将target值与mid指向的值比较,如果target值比mid的内容大,说明target只能在后半部分(low=mid+1),如果target值比mid内容小,说明target只能在前半部分(high=mid-1),如果mid的内容就等于target值,找到了。
3、不断重复第二步,如果high<low,说明没找到。

public static int binarySearch(int[] nums,int target) {
		
		int low = 0;
		int high = nums.length;
		while(low<=high) {
			int mid = (low+high)/2;
			if(nums[mid]>target) {
				high = mid-1;
			}
			else if(nums[mid]<target) {
				low = mid+1;
			}
			else if(nums[mid]==target){
				return mid;
			}
			
		}
		return -1;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值