冒泡、简单选择、插入、递归排序

一、冒泡排序

        冒泡排序是众多排序方法中非常经典、简单的排序。

1.流程

        冒泡排序的流程非常简单。整个算法需要两个嵌套关系的for循环。时间复杂度O(n^2)

        以升序排序为例:

int[] arr= new int[]{6,3,5,9,8,7,4,1,2};

从第一个元素开始,6与他的下一个元素3进行比较,升序数组中大数放在后边,把6与3交换。接下来,

第二个元素变成6,与5比较,交换。

第三个元素变成6,与9比较,无操作。

第四个元素9,与8比较,交换。

经过以上循环,9这个数组里最大的数字,到了最后一位。

同样的操作,重复下去,最后排序完毕。

2.代码实现

int tem,sign = 0;
		for (int i = 0; i<arr.length ; i++)
		{
			for (int j=0 ;j<arr.length-1-i;j++)
			{
				if (arr[j]>arr[j+1]) {
					tem=arr[j];
					arr[j]=arr[j+1];
					arr[j+1] =tem;
					sign = 1;
				}
			}
			if (sign==0)
				break;
			sign = 0;
		}
		System.out.println(Arrays.toString(arr));
	}

二、简单选择排序

1.流程

        选择数组里的最小元素,放到数组的第 1 位;再从剩下的元素中找到最小值,放到第 2 位;依此类推。直接这样做,会导致原第 1 位,和第 2 位上的元素被覆盖,所以采用交换的方法。举例如下:

int[] arr= new int[]{6,3,5,9,8,7,4,1,2};

通过循环,找到最小元素 1 ,与第一位上的6 进行交换;

然后忽略 arr[0] ,寻找从 arr[1] 开始后面的最小值 2 ,与第二位上的3 进行交换。以此类推。

2.代码实现

    int min , minIndex,temp;
		for (int i=0 ; i<arr.length;i++) {
			min=arr[i];
			minIndex=i;
			for (int j = i+1; j<arr.length;j++) {
				if (arr[j]<min) {
					min=arr[j];
					minIndex=j;
				}
			}
			temp=arr[i];
			arr[i]=arr[minIndex];
			arr[minIndex]=temp;	
		}
		System.out.println(Arrays.toString(arr));

三、插入排序

1.流程

        要注意插入排序的开始是数组的第 2 个元素,也就是下标是 1  的位置开始。

        话不多说,直接看例子:

int[] arr= new int[]{6,3,5,9,8,7,4,1,2};

从 3 开始,3 和前面的 6 比较,升序排序,6 应该在后面,于是3、6交换

{3,6,5,9,8,7,4,1,2};

5 和前面的 6 比较,交换;

直到下面这一情况:此时应当给 7 排序

[3, 5, 6, 8, 9, 7, 4, 1, 2]

肉眼所见,7 应该放在 8 的前面。所以我们要做的操作,不仅仅是要与前一个元素比较,而是与前面所有元素比较,找到合适的位置,插入元素。这样的排序方法,可以保证每一个元素插入之前和之后,前面的部分都是有序的。

现在,插入元素的方法就是关键了。

以上面的 7 的排序为例。

首先 设置一个变量 temp=arr[5] 即 7 。

然后 从后向前依次与 7 比较,9 大于 7 ,放在 7的位置上,将其覆盖。

8 放在原来 9 的位置,覆盖原来的 9。

temp 放在原来 8 的位置,ok。

2.代码实现

int j = 0;
		for (int i = 1; i<arr.length;i++) {
			int temp = arr[i];
			for (j=i-1;j>=0;j--) {
				if (arr[j]>temp) {
					arr[j+1] = arr[j];
				}else {break;}
			}
			arr[j+1]  = temp;
		}
		System.out.println(Arrays.toString(arr));

四、递归排序

        我们首先来看递归,递归是一种函数调用自身的方法。

        下面是一段简单的递归代码,输入为 n ,输出为 n

public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		System.out.print("请输入n:");
		int n = in.nextInt();
		System.out.println(recursion(n));
	}
	public static int recursion(int n) {
		if (n==1) {
			return 1;
		}
			return recursion(n-1)+1;
		
	}

1.流程

        在数组里选择一个元素作为基准数,取第一个元素即可。在数组的左右两端同时检索;同时我们设置 i , j 两个变量记录被检索元素的下标。

左端检索到大于基准数的元素时停止;

右端检索到小于基准数的元素时停止;

两元素交换;重复,直到 i >= j ;

        (这样可以使比基准数大的元素在数组的右部分,比基准数小的元素在数组的左部分。)

然后将基准数 与此时 i 或 j 位置上的元素互换,达成以基准数为界,左边小,右边大。

2.代码实现

public static void main(String[] args) {
	int[] arr= new int[]{6,3,5,9,8,7,4,1,2};
    System.out.println(Arrays.toString(fast(arr,0,arr.length-1)));
}
public static int[] fast(int arr[],int left,int right) {
	if (left>=right) {
		return arr;
	}
	int i = left;
	int j = right;
	int base = arr[left];
    while(i!=j) {
		while(arr[j]>= base && i<j) {
			j--;
		}
		while(arr[i]<=base && i<j) {
			i++;
		}
		int temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
        //这里在完成交换之后 arr[j]>=base,arr[i]<=base, 上边的可以继续循环。
        //最后 j 的前移 会使 j == i ;  
	}
	arr[left] = arr[i];
	arr[i] = base;

	fast(arr, left , i-1);
	fast(arr, i+1 , right);
	return arr;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值