插入排序优化和二分法查找的优化

在这里插入图片描述
在比较笨的方法是插入交换排序代码为:

	protected void sort() {
		for(int begin=1;begin<Array.length;begin++) {
			int cur=begin;
			while(cur>0&&cmp(cur,cur-1)<0) {
				swap(cur,cur-1);
				cur--;
			}
		}
	}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述解读一下:这里的是先把要插的数进行备份,但此时5位置上还是有要插的数据的,这里的代码cmp(v,array[cur-1])<0,成立的条件只有位置在 4,5这种情况符合条件,此时的4上的位置的值是比5大的,其他的都是前面的比后面的大,则此时才会进入while循环,在会进行4位置与5位置互换,此时不要考虑array的大小若是个动态数组则就会自动增加,此时的的array.length就为6了,在这里的cur是为了保存原来的design的路径为了方便在下面3位置与4位置交换。
优化的是先将要比较的这个数进行拿出来,与前面的数进行比较若前面的是比较大的就让他往后面移动一位,而不是交换了。其中的上面的swap里面包含三行代码,而这里就只有一行代码了,运行时间减少了。

二分法查找的方法。

查找v在有序数组array中的位置,有则返回,没有则返回-1public class W {
	public static int indexOf(int[] array,int v) {
		if(array==null||array.length==0)return -1;
		int begin=0;
		int end =array.length;
		while(begin<end) {
			int mid=(begin+end)>>1;
		if(v<array[mid]) {
			end=mid;
		}else if(v>array[mid]) {
			begin=mid+1;
		}else {
			return mid;
		}
		}
		return -1;
	}
查找v在数组array中将要插入的位置,返回这个位置。
	public static int search(int[] array,int v) {
		if(array==null||array.length==0)return -1;
		int begin=0;
		int end=array.length;
		while(begin<end) {
		int mid=(begin+end)>>1;
		if(v<array[mid]) {
			end=mid;
		}else {
			begin=mid+1;
		}
		}
		return begin;
	}

在这里面用的是位运算。这样会节省运算,在这里求出来的mid为4.5的时候因为他是整形所以就是取值4,在这里我们先int end=array.length;把他等于最后一个数组最后一个数此时这里面是没有数据的。这里最后的是返回一个return begin

顺序表的简单插入排序代码如下: ```c #include <stdio.h> #define MAXSIZE 10 typedef struct { int r[MAXSIZE+1]; // 存储排序关键字,r[0]不用 int length; // 顺序表长度 } SqList; void InsertSort(SqList *L) { int i, j; for (i = 2; i <= L->length; ++i) { if (L->r[i] < L->r[i-1]) { // 需将L->r[i]插入有序子表 L->r[0] = L->r[i]; // 设置哨兵 for (j = i-1; L->r[j] > L->r[0]; --j) { L->r[j+1] = L->r[j]; // 记录后移 } L->r[j+1] = L->r[0]; // 插入到正确位置 } } } int BinarySearch(SqList L, int key) { int low = 1, high = L.length, mid; while (low <= high) { mid = (low + high) / 2; if (L.r[mid] == key) { return mid; } else if (L.r[mid] > key) { high = mid - 1; } else { low = mid + 1; } } return 0; } int main() { SqList L = {{0, 49, 38, 65, 97, 76, 13, 27, 49}, 8}; InsertSort(&L); int key = 49; int pos = BinarySearch(L, key); if (pos) { printf("%d is found at position %d\n", key, pos); } else { printf("%d is not found\n", key); } return 0; } ``` 这里定义了一个 `SqList` 结构体,包含一个数组 `r` 和一个整型变量 `length`,数组 `r` 存储了排序关键字。`InsertSort` 函数实现了简单插入排序算法,`BinarySearch` 函数实现了二分查找算法,其中 `low` 和 `high` 分别表示查找范围的起始位置和结束位置,`mid` 表示中间位置,如果找到了关键字 `key`,则返回其位置,否则返回 0。 本例中,先将一个顺序表排序,然后查找关键字为 49 的元素。程序输出: ``` 49 is found at position 2 ``` 以上代码仅供参考,实际使用中需要根据具体情况进行适当修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值