コード例 #1
0
 void wiggleSort(vector<int>& nums) {
	    vector<int> m_nums = nums;
	    //find median
	    int median = -1;
	    if (nums.size() % 2 == 0)
		    median = (findKthElem(nums, nums.size() / 2) + findKthElem(nums, nums.size() / 2 + 1)) / 2;
	    else
		    median = findKthElem(nums, (nums.size() + 1) / 2);
		//index rewriting
		#define A(i)  (nums[(2*(i)+1)%(nums.size()|1)])
		//three-way sort
		int i=0,j=0,k=nums.size()-1;
		while(j<=k)
		{
			if(A(j)>median)//j往前行进的条件是A(j)>median 或 A(j)=median;j之前都>=median
			{
				swap(A(i),A(j));
				i++,j++;
			}
			else if(A(j)<median)//k往后行进的条件是:A(j)<median,k之后都<median
			{
				swap(A(j),A(k));
				k--;
			}
			else
				j++;
		}
 }
コード例 #2
0
 // Find k'th element from A/B - idx starts from 0
 double findKthElem(int A[], int m, int B[], int n, int k) {
     if (m>n) return findKthElem(B, n, A, m, k);
     if (!m) return B[k];
     if (k == 0) return std::min(A[0], B[0]);
     int pa = std::min((k+1)/2, m);
     int pb = k+1-pa;
     if (A[pa-1] > B[pb-1]) return findKthElem(A, pa, B+pb, n-pb, k-pb);
     else return findKthElem(A+pa, m-pa, B, pb, k-pa);
 }
コード例 #3
0
 double findMedianSortedArrays(int A[], int m, int B[], int n) {
     if (!m) return (B[n/2]+B[(n-1)/2])/2.0;
     if (!n) return (A[m/2]+A[(m-1)/2])/2.0;
     if ((m+n)%2) {
         return findKthElem(A, m, B, n, (m+n)/2);
     }
     else {
         return (findKthElem(A, m, B, n, (m+n)/2)+
                 findKthElem(A, m, B, n, (m+n)/2-1)) / 2;
     }
 }
コード例 #4
0
 int findKthElem(vector<int> const &nums,int k)
 {
 	int pivot = nums[rand()%nums.size()];
 	vector<int> lessThanK, geThanK;
 	for (auto num : nums)
 	{
 		if (num < pivot)
 			lessThanK.push_back(num);
 		else if (num>pivot)
 			geThanK.push_back(num);
 	}
 	int lt_pivot_num = lessThanK.size(), ge_pivot_num = geThanK.size();
 	if (k <= ge_pivot_num)
 		return findKthElem(geThanK, k);
 	else if (k > nums.size() - lt_pivot_num)
 		return findKthElem(lessThanK, k - (nums.size() - lt_pivot_num));
 	else
 		return pivot;
 };