『壹』 大量數據用哪種演算法排序最好
七種排序演算法:冒泡、選擇、插入、快速、Bucket、Shell、Heap
其中冒泡是最簡單、也是效率最低的一種排序方法,老師要求我們掌握的是選擇排序法。
快速排序法可以說是最好的排序演算法:首先選一個分界值,把大於分界值和小於分界值的數據分成兩部分;對於分開的部分,不斷重復這個過程,直到結束。
『貳』 一組整數排序的演算法。
完整的演算法如下,無需借用空間,也無需對整個序列排序。
#include <stdio.h>
void main()
{
int last = 3;
int cur = 100;
int pos = -1;
int array[9] = {4,3,7,5,9,4,7,6,2};
for(int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
if (array[j] > last && array[j] < cur)
{
cur = array[j];
pos = j;
}
}
if (pos != -1)
printf("a%d = %d\n", pos + 1, cur);
else
break;
last = cur;
cur = 100;
pos = -1;
}
}
『叄』 各種排序演算法比較
插入排序 n*n、希爾排序 <=n*n、起泡排序 <=n* n、快速排序 n *log 2 n、選擇排序=n * n、堆排序n * log2 n、歸並排序 n * n
『肆』 給定如下整數列表,如何最有效的進行排序同時剔除重復的數字
#include<stdio.h>
#include"string.h"
int main(void)
{
char str1[500]={0},str2[256]={0};//定義二個數組,並賦初值為0
int i;
gets(str1);//讀取一個字元串
for(i=0;str1[i];i++)
{
str2[str1[i]]=1;//str1中每個字元的assic碼作為str2的下標值,並把對應位置填充為1,同一個字元的assci值相同,所以這樣就去掉了重復字元
}
for(i=0;i!=256;i++)
if(str2[i]==1)//判斷數組中被str1填充的位置,填充的是非0值,沒填充的是0值
printf("%c",i);//輸出str2的下標值,對應str1中的字元值
putchar('\n');
return 0;
}
『伍』 對全國高考分數排名用什麼排序演算法好在線等解答
應該是計數排序,因為高考成績是值為0~750分的整數,而且就算分數有什麼0.5,高考也會乾脆搞四捨五入,或者直接不給0.5,來確保所有分值都是整數,給計數排序提供了可行性。
計數排序可以將時間復雜度降到最低,為o(n+r),n為人數(約1000萬人!),r=滿分+1=751;而簡單排序法如冒泡 、選擇、插入的時間復雜度都會達到o(n^2)。而且計數排序所用時間長度還比較穩定,最好與最壞的情況基本沒有什麼差距。
這樣算來,計數排序在時間上整整領先了8個數量級,而如今處理器的頻率都是幾個GHz(10^9 Hz級別),還是多核的,10的8~9次方的處理次數在時間上不會造成過大的負擔。
內存佔用上,雖然這個演算法有一定空間復雜度,為o(n+r),高考全國統一考號為14位,需要以長整數的格式存儲(最大值約為9.223*10^18),所以每個考號佔8個位元組,總共8*(n+r)位元組,折算下來大概80多MB,而且原始表單存儲在硬碟里,整個計分程序的內存佔用,滿打滿算也就是你用瀏覽器看幾個網頁的內存佔用,這對現在的電腦不是輕輕鬆鬆?無論是處理速度還是內存佔用,在高考總分排名上,計數排序都是最優方案,擁有最高效率。
再者,計數排序還可以帶來一個不錯的副產物,就是每個分值(或分段)的人數也可以在最後用表格的方式生成,在資料庫內給考生排好序的同時,也給院校招生,與考生估測自己可以進哪個院校,都提供了方便。
總之,雖然我沒有親自參與過這個項目,我只是被排名,被院校挑選的,但是最後,我憑借自己所學的知識,推理出了高考分數的排名機制——計數排序。
補充知識:
計數排序,是給最大最小值差距不大的一組整數(整數的個數可以很多)排序的一種演算法,例如高考總分0~750分,考試分數0~100(或150)分,之類的。它不是很依賴大小的比較,它主要的機制是,遍歷整個原始表單,記住每個對應數值上的對象個數,很多時候也得存儲這些對象對應的編號,這些事作完以後,再根據數值順序,給出已經排序完畢的表單,還可以順便生成每個數值,或數值段的人數。計數排序演算法在處理特定任務上有較大優勢。
『陸』 假定整數在計算機內部以4個位元組表示,請給出一個有效的整數排序演算法
10億個整形數據,可以採用點陣圖的方法進行處理。只要對這10億個數據遍歷1邊就可完成排序。輸出結果的時候同樣遍歷一遍即可。
『柒』 10個整數從小到大排序的演算法流程
void sort(a[],n)
{
for(i=0,i
『捌』 排序演算法性能比較(數據結構)C語言程序
這題你只要把每個演算法的程序代碼看一下,在計算下就行
冒泡排序:兩個循環,從1加到N,(1+N)N/2 = 500500,最壞交換情況是每次判斷都要交換,既500500*3次
選擇排序:也是兩個循環,比較次數跟冒泡排序一樣500500,但是這個只要底層循環交換,既只需1000*3 = 3000次賦值。
插入排序:循環次數一樣500500,但是這個最壞情況是每比較一次就賦值一次,既需500500次賦值
希爾排序:時間復雜度是N^1.3倍,比較次數和賦值應該是1000^1.3次方。
歸並排序和快速排序,你去查查它的時間復雜度是怎麼算,O(lgN*N),好像有系數,演算法導論那本書上有,現在不記得是多少了。
希望能幫到你,
『玖』 數據結構中哪種排序方式效率最好
簡單排序的演算法(直接插入,冒泡,簡單選擇排序)簡單且穩定,適合與待排記錄較小的情況,當當待排序的關鍵碼序列已經基本有序時,用直接插入排序最快。
就平均時間的性能而言,快速排序最佳,即排序速度最快,所以在隨機情況下,快速排序是最佳選擇。一般情況下,快速排序效率最好。
既要節省空間,又要有較快的排序速度,堆排序是最佳選擇,其不足之處是建堆時需要消耗較多時間。
若希望排序是穩定的,且有較快的排序速度,則可選用2路歸並排序,其缺點需要較大的輔助空間分配。
『拾』 整數排序演算法的問題
快排(最普遍 最簡單)
演算法思想為 分治
實現過程如上 gis19831203 所說的
「尋找樞軸(位於樞軸左邊的都比樞軸小,位於樞軸右邊的都比樞軸大),反復如此,用遞歸可以實現。」
堆排(不穩定,但是一種解決某類問題有效的演算法思想)
……
這是時間復雜度為 N*(log2 N)的演算法
更快的演算法我就不知道了!!
你的最大數據的運算量為
2^32*32
估計……
即使是這樣的演算法也要幾十分鍾的運算時間!!!
除非你用超級計算機。。。
冒泡,插入……等N^2的演算法
就不用考慮了
快排需要預先讀入所有數據
堆排好像就不需要 可以一個一個讀 建立堆
然後進行操作 但是 堆也是需要完整記錄的
鑒於你的最大數據量為2^32!!
僅僅從空間上來說就不好滿足~~~
即使演算法效率很高,很快,很牛。
一般的編輯器也很難滿足你的最大數據的要求
對操作系統的要求也很苛刻(建議用Linix)
C 好像自帶 排序函數
!!!!!!!
原來是這樣。。
無語……
這樣的話用 快排演算法
50萬也就是0。01秒吧(應該是瞬間的事情)
你用的演算法是N^2的演算法 太慢了
一般來說這類題要求的時間應該在0。1sec~1sec之間
考察的知識點就是時間復雜度為 N*(log2 N)的排序演算法
你的程序無法在限定時間內完成所有數據的測試
建議使用快排演算法
到網上 搜一艘 此類演算法的講解
找到合適你自己的講解 然後學習。。。。