睡不着写算法(一)

二分查找,和快排。过几天比较下快排和插入排序,两个的效率。

package algorithms;

/**
 * 快排,递归二分查找
 * @author henry
 * @date 2010-06-04  1:04:10
 */
public class RbSearch {

	public static int[] a = { 11, 22, 44, 5, 0, 3, 9, 10, 45 };

	/**
	 * 二分查找
	 * 
	 * @param left
	 * @param middle
	 * @param right
	 * @param searchkey
	 * @return
	 */
	public static boolean binarySearch(int left, int right, int searchkey, int[] arr) {
		
		if(left > right) {//如果左指针大于右指针位置
			return false;//返回false
		}
		
		int middle = (left + right) / 2;//取数组分割点下标
		
		if(searchkey > arr[middle]) {
			return binarySearch(middle + 1, right, searchkey, arr);
		}
		if(searchkey < arr[middle]) {
			return binarySearch(left, middle - 1, searchkey, arr);
		}
		if(searchkey == arr[middle]) {
			System.out.println("找到了!arr[" + middle + "]=" + searchkey);
			return true;
		}
		
		return false;
	}

	/**
	 * 快排2
	 * 这种方式是用数组的第一位数,作为数组分割点,然后分割排序
	 * 
	 * @param arr
	 * @param left
	 * @param right
	 */
	public static void quickSort2(int[] arr, int left, int right) {
		int povit,tmp;
		int i = left;
		int j = right;
		
		povit = arr[left];
		do {
			while(arr[i] < povit && i < right) {//找出比povit大的数
				i++;
			}
			
			while(arr[j] > povit && j > left) {//找出比povit小的数
				j--;
			}
			
			if(i < j) {//如果找出数值的位置下标符合条件,则两数组调换
				tmp = arr[i];
				arr[i] = arr[j];
				arr[j] = tmp;
			}
			
		} while(i < j);
		
		if(i > j) {//如果左指针大于右指针,把分割数跟下标为j的调换数值
			tmp = arr[left];
			arr[left] = arr[j];
			arr[j] = tmp;
		}
		
		if(left < j)
			quickSort2(arr, left, j - 1);
		
		if(j < right)
			quickSort2(arr, j + 1, right);
	}
	
	/**
	 * 快速排序1
	 * 这种方式是第一步就取出给定数组的分割点进行排序
	 * 
	 * @param arr
	 */
	public static void quickSort(int[] arr, int left, int right) {
		int middle, tmp;
		int i = left;
		int j = right;
		
		middle = arr[(left + right)/2];
		
		do {
			while(arr[i] < middle && i < right) {//找出比middle大的数
				i++;
			}
			while(arr[j] > middle && j > left) {//找出比middle小的数
				j--;
			}
			
			if(i <= j) {//如果找出数值的位置下标符合条件,则两数组调换
				tmp = arr[i];
				arr[i] = arr[j];
				arr[j] = tmp;
				i++;//i下标右移
				j--;//j下标左移
			}
			
		} while (i < j);
		
		if(left < j) {
			quickSort(arr, left, j);
		}
		
		if(right > i) {
			quickSort(arr, i, right);
		}
	}

	public static void main(String[] args) {
		System.out.println("原序数组:");
		for (int k : a) {
			System.out.print(k + " ");
		}
		System.out.println();
		quickSort2(a, 0, a.length-1);
		
		System.out.println("排序后:");
		for (int k : a) {
			System.out.print(k + " ");
		}
		System.out.println();
		
		int searchKey = 45;//要查询的数字
		
		if(!binarySearch(0, a.length - 1, searchKey, a)) {
			System.out.println("查找不到对应数据:" + searchKey);
		}
	}
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 冒泡排序算法是一种简单的排序算法,通过重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。 算法流程: 1. 从第一个元素开始,该元素可以认为已经被排序 2. 取出下一个元素,在已经排序的元素序列中从后向前扫描 3. 如果该元素(已排序)大于新元素,将该元素移到下一位置 4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置 5. 将新元素插入到该位置后 6. 重复步骤2~5 代码示例 ```python def bubble_sort(arr): n = len(arr) for i in range(n): for j in range(0, n-i-1): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] return arr ``` 时间复杂度为O(n^2) ### 回答2: 冒泡排序是一种基础的排序算法,其原理是通过相邻元素的比较和交换来逐渐将序列中的最大或最小元素移动到正确的位置。 假设有一个由n个元素组成的待排序序列,冒泡排序的过程如下: 1. 从序列的第一个元素开始,比较相邻的两个元素,如果前一个元素比后一个元素大(或小),则交换它们的位置。 2. 继续比较后面相邻的两个元素,直到最后一个元素。 3. 重复上述步骤,每次只比较尚未确定位置的元素(即,第n-i个元素到第n个元素,其中i为已确定位置的元素个数)。 4. 通过n-1次的遍历,就可以将序列中的最大(或最小)元素移动到正确的位置上。 通过这样的遍历,冒泡排序每次都将序列中最大(或最小)的元素“冒泡”到末尾,因此称为冒泡排序。 冒泡排序的时间复杂度为O(n^2),其中n为待排序序列的长度。尽管冒泡排序的效率并不高,但由于其简单的实现和理解,常用于教学和演示排序算法的原理。 ### 回答3: 冒泡排序是一种简单但低效的排序算法。其基本思想是通过不断比较和交换相邻元素的值,使得较大(或较小)的元素逐渐"浮"到数组的一端。冒泡排序的具体步骤如下: 1. 从数组的第一个元素开始,对相邻的两个元素进行比较。如果前一个元素大于后一个元素,则交换它们的位置。 2. 继续对每一对相邻元素进行比较和交换,直到最后一个元素。 3. 重复上述步骤,对除去已排序的最后一个元素之外的所有元素进行相同的操作,直到整个数组排序完成(即没有任何交换操作)。 冒泡排序的关键是循环遍历数组,并进行比较和交换。为了实现算法,通常会使用双重循环,外循环控制排序的轮数,内循环用于比较相邻元素并进行交换。在每一轮循环后,最大(或最小)的元素都会"冒泡"到数组的一端,因此每一轮循环都可以减少需要比较和交换的元素个数。 对于一个包含n个元素的数组,冒泡排序的最坏时间复杂度为O(n^2),最好时间复杂度为O(n),平均时间复杂度为O(n^2)。 以下是一个使用冒泡排序算法对数组进行升序排序的示例代码: ```python def bubble_sort(arr): n = len(arr) for i in range(n-1): for j in range(n-i-1): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] return arr # 测试示例 arr = [5, 2, 8, 12, 3] print(bubble_sort(arr)) ``` 以上代码会输出[2, 3, 5, 8, 12],表示数组已经按照升序排列完成。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值