日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

2018年蓝桥杯B组题E题+快排

發(fā)布時(shí)間:2023/12/4 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2018年蓝桥杯B组题E题+快排 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目:

E 快速排序:以下代碼可以從數(shù)組a[]中找出第k小的元素。
它使用了類似快速排序中的分治算法,期望時(shí)間復(fù)雜度是O(N)的。
請(qǐng)仔細(xì)閱讀分析源碼,填寫劃線部分缺失的內(nèi)容。

#include <stdio.h> int quick_select(int a[], int l, int r, int k) {int p = rand() % (r - l + 1) + l;int x = a[p];{int t = a[p];a[p] = a[r];a[r] = t;}int i = l, j = r;while(i < j){while(i < j && a[i] < x)i++;if(i < j){a[j] = a[i];j--;}while(i < j && a[j] > x)j--;if(i < j){a[i] = a[j];i++;}}a[i] = x;p = i;if(i - l + 1 == k)return a[i];if(i - l + 1 < k)return quick_select( _____________________________ ); //填空elsereturn quick_select(a, l, i - 1, k); } int main() {int a[] = {1, 4, 2, 8, 5, 7, 23, 58, 16, 27, 55, 13, 26, 24, 12};printf("%d\n", quick_select(a, 0, 14, 5));return 0; }

注意:只填寫劃線部分缺少的代碼,不要抄寫已經(jīng)存在的代碼或符號(hào)。

分析:

好久沒見過快排了,復(fù)習(xí)也沒看過,這里遇到了就簡(jiǎn)單說一下,加深一下印象:
快排是最快的通用內(nèi)部排序算法。按照分治三步法:
(1)劃分問題:將數(shù)組的各個(gè)元素重排后分為左右兩個(gè)部分,使得左邊的任意元素都小于或等于右邊的任意元素。
(2)遞歸求解:把左右兩邊分別排序;
(3)合并問題:不用合并,因?yàn)榇藭r(shí)數(shù)組已經(jīng)完全有序。
快排由于劃分方式不同,版本很多,在這里這道題用的是隨機(jī)數(shù)劃分: int p = rand() % (r - l + 1) + l;表示閉區(qū)間【l~r】的任意一個(gè)數(shù)。

先看參數(shù)的作用:
這里的參數(shù)l表示左指針,r表示右指針(功能同快速排序一致)
參數(shù)1:a表示數(shù)組不變
參數(shù)2:l表示左指針下標(biāo)邊界
參數(shù)2:r表示右指針下標(biāo)邊界
參數(shù)4:k表示選擇第k小的元素

回到快速排序的各個(gè)指針的變化:
l~i區(qū)間內(nèi)都是比樞紐小的,一共i-l+1個(gè)元素;
i+1~r都是比樞紐大的
如果i-l+1比k大,說明要在l~i-1中找;還是找第k個(gè)元素
如果i-l+1比k小,說明要在i+1 ~r某個(gè)值中找,這個(gè)值是多少呢?要看還需要找到新一輪遞歸中找第多少小的元素,這里新參數(shù)k就等于 原k減去當(dāng)前一輪的l~i的個(gè)數(shù) 即k-(i-l+1)

//#include <stdio.h> #include<bits/stdc++.h>int quick_select(int a[], int l, int r, int k) {int p = rand() % (r - l + 1) + l; //l~r之間的一個(gè)隨機(jī)數(shù)int x = a[p];//隨機(jī)數(shù)a[p]的值{int t = a[p]; //交換隨機(jī)數(shù)a[p]和高位右邊第一個(gè)數(shù)a[p] = a[r];a[r] = t;}int i = l, j = r; //i左指針 j右指針while(i < j){while(i < j && a[i] < x)i++;// 最后i==j 或者 a[i]>=xif(i < j) //如果a[i]>=隨機(jī)數(shù)x{a[j] = a[i]; //選一個(gè)比x大的數(shù) 放到高位j--;}while(i < j && a[j] > x)j--;// 最后j==i 或者 a[i]<=xif(i < j) //如果a[i]<=隨機(jī)數(shù)x{a[i] = a[j]; //選一個(gè)比x小的數(shù) 放到低位i++;}}a[i] = x;// p = i;//這里改了p的值 說明會(huì)用到p,且p的值等于i的值if(i - l + 1 == k)return a[i];if(i - l + 1 < k)return quick_select(a,i+1,r,k-(i-l+1)); //填空elsereturn quick_select(a, l, i - 1, k);//a數(shù)組不變 k不變 }int main() {int a[] = {1, 4, 2, 8, 5, 7, 23, 58, 16, 27, 55, 13, 26, 24, 12};printf("%d\n", quick_select(a, 0, 14, 5));return 0; } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的2018年蓝桥杯B组题E题+快排的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。