1045 快速排序

2021-09-29 08:54:02 字數 1627 閱讀 7857

思路一(很瓜的思路):

遍歷資料的同時更新該資料左邊的最大值

將原資料從小到大排序後放入另外乙個陣列中,再將這些資料存在另外乙個陣列的對應下標裡作為右方最小值

遍歷資料時,若當前右方最小值等於該資料,將對應元素置零,右方最小值變為後邊的第乙個非零值

採用思路一可以求解,然而存放右方最小值的陣列大小達到了109,該思路行不通

上網查詢,參考該部落格的思路二,三,寫下**

思路2

#include

#include

using

namespace std;

//num3是排好序的陣列,num2是左邊最大值陣列

int num1[

100004

], num2[

100004

], num3[

100004

], num4[

100004];

intmain()

sort

(&num3[0]

,&num3[n]);

int cnt =0;

for(

int i =

0; i < n; i++)if

(num1[i]

==num3[i]

&& num1[i]

>= num2[i]

) num4[cnt++

]= num1[i];if

(0!= cnt)

else

printf

("0\n\n");

}

思路3:

#include

#include

using

namespace std;

//num2存放該位置上的左方最大值,num3存放右方最小值,包括自己

int num1[

100004

], num2[

100004

], num3[

100004

], num4[

100004];

intmain()

int min = num1[n-1]

;for

(int i = n-

1; i >=

0; i--

)int cnt =0;

for(

int i =

0; i < n; i++)if

(num1[i]

>=num2[i]

&& num1[i]

<= num3[i]

) num4[cnt++

]= num1[i];if

(0!= cnt)

else

printf

("0\n\n");

}

注意:測試點2是沒有主元的情況,需要printf(「0\n\n」);語句

反思:看見排序和25就先入為主想複雜了,這題真的不該

1045 快速排序

如果按照題目正常寫的話就只有第乙個點能通過,結果超時,後來觀察到可以和排好序的陣列比較,數字相等的時候才能算,但是也有一半的點是不能通過的,後來,想到了如果有兩個相同的數字,那麼在排序的過程中,兩個數字就是挨著的,那麼就沒辦法與未排序的陣列一一對應了,這樣就判斷一下,需要判斷的數字是否比之前的最大值...

1045 快速排序

著名的快速排序演算法裡有乙個經典的劃分過程 我們通常採用某種方法取乙個元素作為主元,通過交換,把比主元小的元素放到它的左邊,比主元大的元素放到它的右邊。給定劃分後的 n 個互不相同的正整數的排列,請問有多少個元素可能是劃分前選取的主元?例如給定 n 5 n 5 排列是1 3 2 4 5。則 1 的左...

1045 快速排序

1045 快速排序 25 分 著名的快速排序演算法裡有乙個經典的劃分過程 我們通常採用某種方法取乙個元素作為主元,通過交換,把比主元小的元素放到它的左邊,比主元大的元素放到它的右邊。給定劃分後的 n 個互不相同的正整數的排列,請問有多少個元素可能是劃分前選取的主元?例如給定 n 5 排列是1 3 2...