快速排序&半快速排序思想求n个无序数中第k或者前k个数

一、快速排序总结:  

给快速排序做个总结是看到之前上数据结构的时候给老师写的一个关于考试程序纠错的邮件。错误的程序如下:

void QuickSort(RecType R[],int s,int t)
{
	int i=s,j=t;
	RecType tmp;
	if (s<t) 			
	{	
		tmp=R[s];     		
		while (i!=j)  		
		{	
			while (j>i && R[j].key>tmp.key) //在该处若初始序列首尾值相等,将陷入死循环 
				j--;  		                    //一种修改方法是 R[j].key>=tmp.key
			R[i]=R[j];		                  //另一种是在R[i]=R[j]后加i++语句(后面是j--)
			while (i<j && R[i].key<tmp.key) 
      				i++;		           
			R[j]=R[i];		
		}
		R[i]=tmp;
		QuickSort(R,s,i-1);    	
		QuickSort(R,i+1,t);    	
	}
}
  

   之前写快速排序都是喜欢上面那样写一个函数,快排的经典思想就是分而治之。对一个数组,先选一个pivotkey(枢轴中心),一般情况下就直接选数组的第一个元素。然后对数组从后向前遍历,将小于pivotkey的元素放在数组左边;又对数组从前向后遍历,将大于pivotkey的元素放在数组的右边;如此反复之后前后遍历的伪指针相等,这时候也就是pivotkey值应在的位置:左半部分全小于pivotkey,右半部分全大于pivotkey。 接下来分而治之,采用递归在将左半部分和右半部分分别再做上述操作。时间复杂度最好的情况下(每次枢轴放在数组正中间)是O(n*logn)。 最坏的情况(数组本身已经有序顺序或者逆序)是O(n^2)。 快速排序复杂度分析

       上面的写法将数组partition和算法递归的过程写在了一起。两个过程分开写的

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
解长度为n的无序数列第k小的数,可以使用Python的快速选择算法。 快速选择算法的基本思路是利用快速排序思想,通过每次划分数组,将比选定元素小的数放在左边,比选定元素大的数放在右边。然后根据选定元素的位置,判断第k小的数在左边还是右边,并进一步在对应的子数组继续划分,直到选定元素恰好是第k小的数。 下面是解代码的示例: ```python def quick_select(arr, left, right, k): if left == right: return arr[left] pivot_index = partition(arr, left, right) # 划分数组 if pivot_index == k - 1: return arr[pivot_index] elif pivot_index > k - 1: return quick_select(arr, left, pivot_index - 1, k) # 在左侧继续划分 else: return quick_select(arr, pivot_index + 1, right, k) # 在右侧继续划分 def partition(arr, left, right): pivot_index = left pivot = arr[right] for i in range(left, right): if arr[i] < pivot: arr[i], arr[pivot_index] = arr[pivot_index], arr[i] pivot_index += 1 arr[pivot_index], arr[right] = arr[right], arr[pivot_index] return pivot_index # 示例使用 arr = [9, 4, 5, 2, 8, 1, 7, 3, 6] n = len(arr) k = 3 result = quick_select(arr, 0, n - 1, k) print(f"长度为{n}的无序数列第{k}小的数为:{result}") ``` 以上代码,定义了`quick_select`函数来解第k小的数。在主函数,给定了一个示例数列arr和需要查找的第k小的数,通过调用`quick_select`函数后输出结果。 注意,此代码假设所查找的数存在于数组,若不存在,则需要增加相应的判断。 这样,就可以使用Python解长度为n的无序数列第k小的数了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值