数据结构和算法学习(3)-简单排序

本次学习主要内容:冒泡排序、选择排序、插入排序

排序步骤总体思路

1.比较两个数据项

2.交换两个数据项或者复制其中一项

冒泡排序

-遵循规则

1.从第二项开始,依次与前一项进行比较

2.前一项大于后一项则交换位置,否则无动作

3.向右移动,进行下一次比较

4.比较至最后一项后从步骤1开始重复,直到整个数组有序

因为最大的数据项总是“冒泡”到数组的顶端,故称“冒泡排序”

-代码实现

int[] sort=new int[100];
Random r = new Random();
int temp=0;
for (int i = 0; i < sort.length; i++) {
	sort[i]=r.nextInt(100);
}
for (int i = sort.length; i > 0; i--) {
	for (int j = 1; j < i; j++) {
		if (sort[j]>sort[j-1]) {
			continue;
		}else {
			temp=sort[j];
			sort[j]=sort[j-1];
			sort[j-1]=temp;
		}
	}
}
for (int i : sort) {
	System.out.print(i+" ");
}
由于每一次都会将当前最大的数字排至队尾,所以内层循环应当循环(数组长度-外层循环次数)次

-排序效率

数组长度为N,则进行N次排序,第i次排序比较了N-i次

也就是做了N^2/2次比较

也就是时间复杂度为

O(N^2)

选择排序

-遵循规则

1.找到当前数据中最小值

2.与当前数据中下标最小值交换

3.重复步骤1开始,直到整个数组有序

-代码实现

int[] sort = new int[100];
Random r = new Random();
int temp = 0;
int sign = 0;
for (int i = 0; i < sort.length; i++) {
	sort[i] = r.nextInt(100);
}
for (int i = 0; i < sort.length; i++) {
	int min = sort[i];
	for (int j = i; j < sort.length; j++) {
		if (sort[j] < min) {
			min = sort[j];
			sign = j;
		}
	}
	temp = sort[i];
	sort[i] = min;
	sort[sign] = temp;
}
for (int i : sort) {
	System.out.print(i + " ");
}

-排序效率

根据比较次数来讲,与冒泡交换无异,但是交换次数要少的多,少于数组长度,虽然时间复杂度为

O(N^2)

但是无疑要比冒泡排序要快,当N值较小时,特别的交换时间级比比较时间级大得多的时候,选择排序是相当快的

插入排序

-遵循规则

1.选取一个标志,要求标志左端有序

2.从标志起,将右侧数据依次向左侧的有序数组中插入

3.从步骤1开始重复,直到整个数组有序

-代码实现

int[] sort = new int[100];
Random r = new Random();
int temp = 0;
for (int i = 0; i < sort.length; i++) {
	sort[i] = r.nextInt(100);
}
for (int i = 1; i < sort.length; i++) {
	if (sort[i - 1] > sort[i]) {
		temp = sort[i];
		int j = i;
		while (j > 0 && sort[j - 1] > temp) {
			sort[j] = sort[j - 1];
			j--;
		}
		sort[j] = temp;
	}
}
for (int i : sort) {
	System.out.print(i + " ");
}

-排序效率

在第一次排序中最多比较一次,第二次排序中最多比较两次,依次类推,最后一次比较N-1次。故最多比较N*(N-1)/2次

然而在每次次排序发现插入点之前平均只有一般的数据参与了比较,也就是约比较N*(N-1)/4次

复制次数大致等于比较次数,故对于随机数据而言,比冒泡排序快一倍,比选择排序略快

然而对于已经有序或者基本有序的数据而言,插入排序要好得多,由于while条件多数为假,故此之变成了外层循环的一个简单语句

所以

有序情况:O(N)

无序情况:O(N^2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值