求無需陣列第K小的數及其位置

2021-06-05 07:21:49 字數 4755 閱讀 4782

#include "stdafx.h"

#include #include #include void swap(int & a, int & b);

int find_position(int* a,int k, int low,int high);

int find_orderk(int* a, int k, int low,int high);

int maxcount = 10;

void swap(int & a, int & b)

int get_position(int* a, int count,int value)

}return pos;

}void print_array(int* a, int count)

}//隨機選取陣列指定範圍內的乙個數value,

//把指定範圍內的數以value為分界點,左邊部分大於等於value,右邊部分小於value

//返回所選數值所在的位置

// a[low]... a[m]...a[hight]

// ^

// > value value < value

// ^

// p

int find_position(int* a, int low,int hight)

//隨機選取low與hight之間的乙個數作為基準

int m = rand() % (hight - low) + low;

int value = a[m]; //選取元素的值

int p = m; //選取元素的索引

int lowpos = low; //第乙個小於value的元素索引

int hightpos = hight; //最後乙個大於value的元素索引

bool bfindl = false; //是否存在小於value的元素

bool bfindh = false; //是否存在大於value的元素

for (int i = low; i <= hight; i++)

}else

}//第乙個小於value的索引

else if( a[i] < value && !bfindl)

}//存在大於value的元素,並且最後乙個大於value的元素在m之後,需要交換

if(bfindh && hightpos > m)

//存在小於value的元素,並且第乙個小於value的元素在m之前,需要交換

if(bfindl && lowpos < m)

return p;

}//隨機選取陣列指定範圍內的乙個數value,

//把指定範圍內的數以value為分界點,左邊部分大於等於value,右邊部分小於value

//返回所選數值所在的位置

// a[low]... a[m]...a[hight]

// ^

// > value value < value

// ^

// p

int find_position_h(int* a, int low,int hight)

//隨機選取low與hight之間的乙個數作為基準

int m = rand() % (hight - low) + low;

int value = a[m]; //選取元素的值

int p = m; //選取元素的索引

int lowpos = low; //第乙個小於value的元素索引

int hightpos = hight; //最後乙個大於value的元素索引

bool bfindl = false; //是否存在小於value的元素

bool bfindh = false; //是否存在大於value的元素

for (int i = low; i <= hight; i++)

}else

}//第乙個小於value的索引

else if( a[i] < value && !bfindl)

}//存在大於value的元素,並且最後乙個大於value的元素在m之後,需要交換

if(bfindh && hightpos > m)

//存在小於value的元素,並且第乙個小於value的元素在m之前,需要交換

if(bfindl && lowpos < m)

return p;

}//隨機選取陣列指定範圍內的乙個數value,

//把指定範圍內的數以value為分界點,左邊部分大於等於value,右邊部分小於value

//返回所選數值所在的位置

// a[low]... a[m]...a[hight]

// ^

// < value value > value

// ^

// p

int find_position_l(int* a, int low,int hight)

//隨機選取low與hight之間的乙個數作為基準

int m = rand() % (hight - low) + low;

int value = a[m]; //選取元素的值

int p = m; //選取元素的索引

int hightpos = low; //第乙個大於value的元素索引

int lowpos = hight; //最後乙個小於value的元素索引

bool bfindl = false; //是否存在小於value的元素

bool bfindh = false; //是否存在大於value的元素

for (int i = low; i <= hight; i++)

}else

}//第乙個大於value的索引

else if( a[i] > value && !bfindh)

}//存在大於value的元素,並且第乙個大於value的元素在m之前,需要交換

if(bfindh && hightpos < m)

//存在小於value的元素,並且最後乙個小於value的元素在m之後,需要交換

if(bfindl && lowpos > m)

return p;

}//獲得陣列指定範圍【low,height】內第k大的數所在的位置

int find_orderk(int* a, int k, int low,int hight)

//p與low索引之間的元素個數大於k

else if (p-low > k-1)

return p;

}//獲得陣列指定範圍【low,height】內第k大的數所在的位置

int find_orderk_h(int* a, int k, int low,int hight)

//p與low索引之間的元素個數大於k

else if (p-low > k-1)

return p;

}//獲得陣列指定範圍【low,height】內第k小的數所在的位置

int find_orderk_l(int* a, int k, int low,int hight)

//p與low索引之間的元素個數大於k

else if (p-low > k-1)

return p;

}int main ()

while ( n > 100 || n <= 0);

maxcount = n;

int i = 0;

while(i < n)

//輸出陣列元素

print_array(srcarray, n);

//獲得引數

dowhile ( k > n || k <= 0);

//獲得第k大元素位置

int newpos = find_orderk_h(srcarray, k, 0, n-1);

int value = srcarray[newpos];

int srcpos = get_position(keyarray, n, value);

printf("\n 陣列中第 %d 大的數值: %d 位置: %d \n", k, value, srcpos);

system("pause");

memcpy(srcarray, keyarray, sizeof(srcarray));

//獲得第n - k + 1小元素位置

int no = n - k + 1;

int newpos2 = find_orderk_l(srcarray, no, 0, n-1);

print_array(srcarray, n);

int value2 = srcarray[newpos2];

int srcpos2 = get_position(keyarray, n, value2);

printf("\n 陣列中第 %d 小的數值: %d 位置: %d \n", no , value2, srcpos2);

system("pause");

memcpy(srcarray, keyarray, sizeof(srcarray));

}while ( true );

return 0;

}

求無需序列中第k小的元素(優先佇列)

編寫乙個實驗程式,利用priority queue 優先佇列 求粗乙個無序整數序列中第k小的元素 分析 建立乙個priority queue,greater 的小根堆pq,將陣列a中的所有元素進隊,再連續出隊,第k個出隊元素即為所求。對應 如下 include include using names...

快速排序(求第k小的數)

快排是利用的partition演算法,基本思想是從第乙個數開始,利用partition演算法將這個數在有序序列中的位置找到,這個數的左邊部分都是小於它的數,右邊部分都是大於他的數,然後通過分治的方法對左右兩個區間再進行partition操作,partition演算法 如下 int partition...

程式設計練習 求無序陣列第k小的數

為同寢的傢伙寫了乙個求乙個無序陣列中第k小數的程式。思想就是快排的思想。找乙個點,然後放到末尾,然後將小於這個數的值放在陣列前面,大於這個值的放在陣列後面,然後在將這個末尾的數放回。這個末尾數放入的位置i代表已經找到第i小的數。下面你應該明白了吧,放入的位置如果是k,恭喜你找到了第k小的數。同樣找到...