Esempio n. 1
0
void heapsort(int array[],int length){
    for(int i = (length-1)/2 ; i >= 0; i--){
	   heapAdjust(array,i,length);
	}
	for(int i = length - 1 ; i > 0 ; i--){
	   swap(array,0,i);
	   heapAdjust(array,0,i-1);
	}
}
	int* heapSort(int* A, int n) {
        if(NULL == A || n < 2)
            return A;
		for (int i = (n >> 1) - 1; i >= 0; --i)
			heapAdjust(A, i, n);
		for (int i = n - 1; i > 0; --i) {
			swap(A[i], A[0]);
			heapAdjust(A, 0, i);
		}
		return A;
	}
Esempio n. 3
0
 /*
  * param k : description of k
  * param nums : description of array and index 0 ~ n-1
  * return: description of return
  */
 int kthLargestElement(int k, vector<int> nums) {
     if(k < 1 || k > nums.size())
     	return 0;
     int len = nums.size();
     for(int i = nums.size() / 2 - 1; i >= 0; --i)
     	heapAdjust(nums, i, nums.size());
     for(int i = nums.size() - 1; i >= len - k; --i) {
     	swap(nums[0], nums[i]);
     	heapAdjust(nums, 0, i);
     }
     return nums[len - k];
 }
Esempio n. 4
0
void HeapSort(int *arr,int n)
{
	int i;

	for(i=n/2;i>=0;i--){
		heapAdjust(arr,i,n);
	}

	for(i=n-1;i>=0;i--){
		swap(arr,i,0);
		heapAdjust(arr,0,i);
	}

}
	vector<int> sortElement(vector<int> A, int n, int k) {
		if (n < 2)
			return A;
		vector<int> myHeap(A.begin(), A.begin() + k);
		makeHeap(myHeap);
		for (int i = k; i < A.size(); ++i) {
			A[i - k] = myHeap[0];
			myHeap[0] = A[i];
			heapAdjust(myHeap, 0, k);
		}
		for (int i = A.size() - k; i < A.size(); ++i) {
			A[i] = myHeap[0];
			swap(myHeap[0], myHeap[k - 1]);
			heapAdjust(myHeap, 0, --k);
		}
		return A;
	}
Esempio n. 6
0
elemtype *dePrioQ(PrioQ *q) {
    if ( q->len == 0 )
        return NULL;
    elemtype *a = q->data[0];
    q->data[0] = q->data[q->len-1];
    heapAdjust(q->data, --q->len, 0, q->cmp);
    return a;
}
Esempio n. 7
0
File: sort.c Progetto: errord/sirius
void heap_sort(int a[], int l)
{
  
  //对顺序表L做堆排序。
  int i,j,t;
  
  for(i = l/2; i >= 0; --i) //把a[1..L.length]建成大顶堆
    heapAdjust(a, i, l);
  
  for(i = l; i > 0; --i)
    {
      
      t = a[0];
      //将堆顶记录和当前未经排序子序列a[1..i]
      a[0] = a[i];
      //中的最后一个记录相互交换
      a[i]=t;
      
      heapAdjust(a, 0, i-1);
      //将L.r[1..i-1]重新调整为大顶堆
    }  
}
Esempio n. 8
0
/** 
  * @brief 堆排序 
  * @param R为待排序的数组,size为数组的长度 
  *  时间复杂度:构建大(小)顶堆,完全二叉树的高度为log(n+1),因此对每个结点调整的时间复杂度为O(logn) 
  *           两个循环,第一个循环做的操作次数为n/2,第二个操作次数为(n-1),因此时间复杂度为O(nlogn) 
  */  
void heapSort(int R[], int size)  
{  
    int i, temp;  
    for ( i = size / 2 - 1; i >= 0; --i ) {  //前size/2个为非叶子节点 
        heapAdjust2(R, i, size -1);  //建初始堆
    }  
    for ( i = size - 1; i >=1; --i ) { //进行n-1趟堆排序,堆重建后,R[0]最大,放到最后,重新建堆 
        temp = R[i];  
        R[i] = R[0];  
        R[0] = temp;//表尾和表首的元素交换  
        heapAdjust(R, 0, i - 1);//把表首的元素换成表尾的元素后,重新构成大顶堆,因为除表首的元素外,  
                                //后面的结点都满足大顶堆的条件,故heapAdjust()的第二个参数只需为0  
    }  
}   
	void makeHeap(vector<int> &a) {
		for (int i = a.size() / 2 - 1; i >= 0; --i)
			heapAdjust(a, i, a.size());
	}