查找第i个元素
来源:互联网 发布:交换机 mac 编辑:程序博客网 时间:2024/05/16 08:42
利用快速排序随机算法实现查找第i个数据,
唯一不同的是不必每次都对其进行排序,只需要对一边进行排序
同时:一版和二版的算法导论,快排有一点点不同,就在于是从第一个数,还是从最后一个数
快排的算法复杂度为O(nlgn)但是这个随机选择的期望时间为O(n)
#include <stdio.h> #include <stdlib.h> int radomselect(int data[],int begin,int end,int num); void exchange(int data[],int i,int j); int radom_partition(int data[],int begin,int end); int npartition(int data[],int begin,int end); int main() { int nData[8] = {5,3,2,6,4,1,3,7}; //创建10个数据,测试 int m=radomselect(nData, 0,7,7); //调用插入排序 printf("%d/n",m); for (int i = 0; i < 8; ++i) { printf("%d ", nData[i]); } printf("/n"); system("puase"); return 0; } int radomselect(int data[],int begin,int end,int i) { if(begin==end) return data[begin]; int q=radom_partition(data,begin,end); int k=q-begin; if(i==k) return data[q]; else if(i<k) return radomselect(data,begin,q,i); else return radomselect(data,q+1,end,i-k-1); } void exchange(int data[],int i,int j) { int temp=data[i]; data[i]=data[j]; data[j]=temp; } int radom_partition(int data[],int begin,int end) { int i = begin + rand() % (end - begin); exchange(data,i,end); return npartition(data,begin,end); } int npartition(int data[],int begin,int end) { int x=data[begin]; int i=begin; int j=end; while(1) { while(data[i]<x) { i++; } while(data[j]>x) { j--; } if(i<j) { exchange(data,i,j); i++; j--; } else return j; } }
- 查找第i个元素
- 查找第i小的元素
- 随机查找数组中第i个元素(按顺序排列的)
- 搜索第i个元素的地址
- 获得ArrayList的第i个元素
- 查找单链表中倒数第k个元素
- 查找单链表中倒数第k个元素
- 查找单链表中倒数第m个元素
- 查找单链表倒数第k个元素
- 单链表查找倒数第k个元素
- 查找单链表中倒数第k个元素
- 单链表查找倒数第N个元素&输出中间元素
- 最坏为线性时间的查找第i小元素
- 查找无序序列中第i小的元素
- 查找数组中第i小的元素
- 算法代码:查找数组中第i小的元素
- C语言非排序查找第i小元素
- 【算法】查找数组第i小的元素的算法
- 快速排序
- Junit 4
- 计数排序
- 基数排序
- 最大值-最小值
- 查找第i个元素
- MySQL的使用
- tomcat是什么
- javascript 动态改变菜单内容
- 银行家算法的C实现
- Android 网络应用重点———使用HttpURLConnection 上传文件
- 泛型HibernateDAO的实现
- 转:text box 阻止文本框回车键动作
- 提交表单不刷新页面