排序

冒泡排序的思想:遍历数组的所有元素,比较相邻的2个元素,如果他们顺序错误,就交换他们,遍历第一次,最大的数字就移动到最后。下一次遍历剩下的元素,将第二最大的数字移动到倒数第二的位置上,依次遍历,直到最后数组有序。
选择排序的思想:遍历数组所有元素,记住最大元素的位置,然后将最大的元素和最后一个元素交换,再遍历余下的元素,找出余下元素的最大值,和倒数第二的位置进行交换,依次遍历,直到所有元素有序。不稳定
插入排序的思想:遍历所有元素,每经过一个元素,就在前面的元素中找到该元素的正确位置,并把该元素插入该位置,遍历完成,数组变成有序。
希尔排序的思想:插入排序的扩展,通过允许相隔较远的元素进行交换,然后逐步缩小间隔,来提高速度。
计数排序的思想:将每个元素对应放到一个抽屉里,相同元素的计数增加。需要n个不同数字的抽屉,空间要求高。不稳定
归并排序的思想:分而治之的思想,递归的拆分数组,直到拆分到包含2个元素为止,将这2个元素排序,然后依次回归,将拆分出来的数组进行合并排序,直到最后全部排序完成。
快速排序的思想:选定一个元素a,然后分别从数组的两端遍历元素,和元素a比较,从前端找到比a大的元素,从后端找到比a小的元素,然后交换这2个元素,继续遍历,直到前端位置和后端位置相交,此时将a与后端位置的元素交换。再继续按照以上方法分别处理a左右两边的元素,直到排序完成。

希尔排序程序如下:

	public void test3(int[] n){
	    //初始跨度为数组大小
		int gap = n.length;
		int len = n.length;
		int tmp = 0;
		while(gap > 0){
			for(int i=gap; i<len; i++){
				//以跨度大小进行循环处理数组
				for(int j=i; j>gap - 1; j=j - gap){
					//比较数值大小,并进行交换
					if(n[j - gap] > n[j]){
						tmp = n[j - gap];
						n[j - gap] = n[j];
						n[j] = tmp;
					}
				}
			}
			//将跨度减半
			if(gap == 2){
				gap = 1;
			} else {
				gap = gap / 2;
			}
		}
	}

将一个排序的数组,从某个位置断开,然后将前段放到最后,在新的数组中查找最小的数字。

public int search(int[] n,int dest){
    //判断是否空数组
    if(n.length == 0){
        return -1;
    }
    int left = 0;
    int mid = 0;
    int right = n.legth - 1;
    //循环遍历数组
    while(left + 1 < right){
        mid = left + (right - left) / 2;
        //如果中间的值等于目标值,直接返回中间位置索引
        if(n[mid] == dest){
            return mid;
        }
        //如果左边是有序的
        if(n[left] <= n[mid]){
            //若目标值在左边,继续在左边查找
            if(n[left] <= dest && dest <= n[mid]){
                right = mid;
            } else {
                left = mid;
            }
        } else {
            //如果目标值在右边,继续在右边查找
            if(n[mid] <= dest && dest <= n[right]){
                left = mid;
            } else {
                right = mid;
            }
        }
    }
    //如果左边的值等于目标值,返回左边的位置索引
    if(n[left] == dest){
        return left;
    }
    if(n[right] == dest){
        return right;
    }
    return -1;
}

归并排序程序

	public void sort(int[] n,int start,int end){
	    //计算数组的中间位置
	    int mid = start + (end - start) / 2;
	    if(start < end){
	        //前半段排序
	    	sort(n,start,mid);
	    	//后半段排序
	    	sort(n,mid+1,end);
	    	//合并
	    	merge(n,start,mid,end);
	    }

	}
	static void merge(int[] n,int start,int mid,int end){
		int[] tmp = new int[end - start + 1];
		int i = start;
		int j = mid+1;
		int k = 0;
		//遍历前后数组,并进行排序,将排序结果保存在临时数组中
		while(i <= mid && j <= end){
			if(n[i] > n[j]){
				tmp[k++] = n[j++];
			} else {
				tmp[k++] = n[i++];
			}
		}
		//将左边剩余数加到临时数组
		while(i <= mid){
			tmp[k++] = n[i++];
		}
		//将右边剩余数加到临时数组
		while(j <= end){
			tmp[k++] = n[j++];
		}
		//将临时数组的内容覆盖原来数组的内容
		for(int m=0; m<tmp.length; m++){
			n[m+start] = tmp[m];
		}
	}
	//测试案例
	public static void main(String[] args){
	    int[] d = new int[]{1,5,7,9,3,2};
	    sort(d,0,5);
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值