91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

求最小的k個數

發布時間:2020-07-01 13:11:38 來源:網絡 閱讀:488 作者:Sekai_Z 欄目:編程語言

輸入n個整數,找出其中最小的k個數

    解法1:需要修改輸入的數組,基于partition快速排序來做,時間復雜福O(N)

    分析:基于數組的第k個元素來調整,使的比第k個數大的所有數字放到數組的右邊,這樣,數組左邊k個就是最小的k個數字

void GetLestNumber(int *input, int n, int *output, int k)
{
	if (input == NULL || output == NULL || k > n || n <= 0 || k <= 0)
		return;

	int start = 0;
	int end = n - 1;
	int index = Partition(input, n, start, end);
	while (index != k - 1)
	{
		if (index > k - 1)
		{
			end = index - 1;
			index = Partition(input, n, start, end);
		}
		else
		{
			start = index + 1;
			index = Partition(input, n, start, end);
		}
	}
	for (int i = 0; i < k; ++i)
	{
		output[i] = input[i];
	}
}

解法二:

    分析:先創建一個大小為k的數據容器來存儲最小的k個數字,接著每次從輸入的n個整數中讀入一個數,如果容器中少于k個數則直接放,若大于則表示容器以滿,此時找出容器中最大值,然后拿輸入的值和最大值比較,若待插入的數小于最大值,則直接替換。

    最大堆的結構每次可以在O(1)得到最大值,但需要o(logk)時間來完成刪除及插入

    紅黑樹同上,但是代碼簡于大堆

void GetLestNumber(int *input, int n, int *output, int k)
{
        if (input == NULL || output == NULL || k > n || n <= 0 || k <= 0)
          return;

 int start = 0;
      int end = n - 1;
    int index = Partition(input, n, start, end);
        while (index != k - 1)
      {
           if (index > k - 1)
               {
                   end = index - 1;
                    index = Partition(input, n, start, end);
            }
           else
                {
                   start = index + 1;
                  index = Partition(input, n, start, end);
            }
   }
   for (int i = 0; i < k; ++i)
      {
           output[i] = input[i];
       }
}
解法二:
    分析:先創建一個大小為k的數據容器來存儲最小的k個數字,接著每次從輸入的n個整數中讀入一個數,如果容器中少于k個數則直接放,若大于則表示容器以滿,此時找出容器中最大值,然后拿輸入的值和最大值比較,若待插入的數小于最大值,則直接替換。
    最大堆的結構每次可以在O(1)得到最大值,但需要o(logk)時間來完成刪除及插入
const int N = 1000;
const int k = 10;
void AdjustDown(int *a, int size, int parent)
{
 int child = (parent - 1) / 2;
       while (child < size)
     {
           if (child+1<size&&a[child]>a[child + 1])
                      child++;
            if (a[child]>a[parent])
          {
                   swap(a[child], a[parent]);
                  parent = child;
                     child = (parent - 1) / 2;
           }
           else
                        break;
      }
}
void GetTopK(int*a)
{
  assert(k < N);
   int top[k];
 for (int i = 0; i < k; i++)
      {
           top[i] = a[i];
      }
   for (int i = (k - 2) / 2; i >= 0; i++)
   {
           AdjustDown(top, k, i);
      }
   for (int i = N-k-1; i < N; i++)
  {
           if (a[i]>top[0])
         {
                   top[0] = a[i];
                      AdjustDown(top, k, 0);
              }
   }
}


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

汕头市| 灌云县| 江口县| 柘城县| 称多县| 板桥市| 吉木萨尔县| 定西市| 独山县| 渑池县| 都安| 牟定县| 胶州市| 开化县| 延长县| 宝丰县| 普定县| 法库县| 盐源县| 邮箱| 开封市| 石阡县| 秦安县| 辽中县| 泉州市| 溆浦县| 吴忠市| 明水县| 公安县| 来安县| 大丰市| 金秀| 天镇县| 兰坪| 宜昌市| 临沂市| 无极县| 米泉市| 德昌县| 锡林浩特市| 霍城县|