快速排序:快排採用分治的策略,先從數列中取出乙個元素作為作為基準元素,以基準元素為標準,將問題分解為兩個子串行,使小於基準的子串行在左側,使大於等於基準元素的子串行右側,對兩個子串行再進行快速排序,最終得到排好序的序列。
時間複雜度:o(nlogn) ,空間複雜度o(logn) ,快速排序是不穩定的
code:
#include#include#include#includeusing namespace std;
int a[100],n;
int solve(int l,int r)//取序列的第乙個數為基準元素
swap(a[i-1],a[l]);//
return i-1;//返回基準元素的位置
}void qsort(int l,int r)//遞迴實現
/*void qsort(int l,int r)//非遞迴實現
}}*/
int main()
qsort(1,n);
for(int i=1; i<=n; i++)
}
快排求第k大:利用快速排序的特點,第一遍排序會確定乙個基數的位置,這個數左邊都比它小,右邊都比他大,當右邊區間大於k時,說明我們求的第k大數在右邊區間,這時我們可以捨棄左邊區間,將範圍縮小到右邊區間從而重複上述過程,直到確定乙個數的位置時,這個數右邊區間數的個數是k-1,那麼這個數字就是我們所求。反之亦然。(如果序列中有重複的數字,看題目具體要求判斷用不用去重)
時間複雜度:o(n)
code:
#include#include#includeusing namespace std;
int n,k;
int a[100];
int solve(int l,int r)
swap(a[i-1],a[l]);
return i-1;
}//void qsort(int l,int r)//遞迴
//// if(r>mid&&midn-k+1) qsort(l,mid-1);
//}void qsort(int l,int r)//非遞迴
}int main()
qsort(1,n);
printf("%d\n",a[n-k+1]);}/*
4 31 3 4 2
*/
可以從大到小排序,直接找第k個位置上的數就可以。 尋找第K大的數(快排思想)
使用快排思想找第k大的數,演算法複雜度o n 1.以陣列a的第0位a 0 為參考基準base,將陣列劃分為兩個部分 如果找第k大的數,則將大於base的數往前挪,將小於base的數往後挪。如果找第k小的數,則與此相反。劃分過程與快排相同,使用兩個指標i和j分別指向陣列的首尾,根據指標所指元素與基準b...
演算法 快速排序 經典快排 隨機快排
經典快排的思路是選取陣列的最後乙個數 x,按照問題一的思路把整個陣列劃分成小於等於 x 大於 x兩個部分,將 x 和 大於 x 部分陣列的第乙個元素交換位置。此時整個陣列劃分成小於等於 x x 大於 x三個部分,也就是這一次排序將 x 值排好位置。再分別對小於等於 x和大於 x中的陣列遞迴劃分,直到...
快排的思想求第K小的數
描述輸入n 個數,m 次查詢。每次查詢給出乙個數x。要求 每次查詢輸出前 x個數中第 i小的數。i為第 i次查詢 你可以假設 m n xi xi 1 xi 2 xm xm n 輸入 line0 t line1 n,m line2 linen 1 num1,numn linen 2 linen 2 m...