當前位置:首頁 » 操作系統 » shell演算法

shell演算法

發布時間: 2022-05-13 11:08:24

㈠ Shell排序的演算法步驟

Step1 將n個元素個數列分為5個小組,在每個小組內按直接插入法排序;
step2 在第i步,分組個數取 di+1 =(di +1)/2 {9,5,3,2,1};相臨兩組之間的對應元素進行比較,如果ai>aj,則交換它們的位置;
Step3 當dK = 1的循環過程完成後,排序過程結束。
希爾排序舉例:設有字元數列f d a c b e,執行Shell排序:

㈡ shell排序演算法

很簡單,這些問題你試著一步一步走下就知道了

就是從第一個數開始,判斷第一個數和n/2那個數的大小,如果v[0]大於v[n/2]
就交換。
1 2 3 4 5 6

1與3比較,2與4比較,3與5比較...

㈢ 計算機上的「shell」是什麼

計算機上的shell是殼(用來區別於核)的意思,是指「提供使用者使用界面」的軟體(命令解析器)。
它類似於DOS下的command和後來的cmd.exe。它接收用戶命令,然後調用相應的應用程序。同時它又是一種程序設計語言。作為命令語言,它互動式解釋和執行用戶輸入的命令或者自動地解釋和執行預先設定好的一連串的命令;作為程序設計語言,它定義了各種變數和參數,並提供了許多在高級語言中才具有的控制結構,包括循環和分支。在排序演算法中,Shell是希爾排序的名稱。
文字操作系統與外部最主要的介面就叫做shell。shell是操作系統最外面的一層。shell管理你與操作系統之間的交互:等待你輸入,向操作系統解釋你的輸入,並且處理各種各樣的操作系統的輸出結果。shell提供了你與操作系統之間通訊的方式。這種通訊可以以交互方式(從鍵盤輸入,並且可以立即得到響應),或者以shell script(非交互)方式執行。shell script是放在文件中的一串shell和操作系統命令,它們可以被重復使用。本質上,shell script是命令行命令簡單的組合到一個文件裡面。

㈣ shell排序法是怎麼實現

希爾Shell排序是一種插入排序演算法,它出自D.L.Shell,因此而得名。Shell排序又稱作縮小增量排序。

先取一個小於n的整數d1作為第一個增量,把文件的全部記錄分成d1個組。所有距離為dl的倍數的記錄放在同一個組中。先在各組內進行直接插入排序;然後,取第二個增量d2<d1重復上述的分組和排序,直至所取的增量dt=1(dt<dt-l<;…<d2<d1),即所有記錄放在同一組中進行直接插入排序為止。

該方法實質上是一種分組插入方法。

演算法分析

增量序列的選擇

Shell排序的執行時間依賴於增量序列。

好的增量序列的共同特徵:

① 最後一個增量必須為1;

② 應該盡量避免序列中的值(尤其是相鄰的值)互為倍數的情況。

有人通過大量的實驗,給出了目前較好的結果:當n較大時,比較和移動的次數約在n到1.6n之間。

Shell排序的時間性能優於直接插入排序

希爾排序的時間性能優於直接插入排序的原因:

①當文件初態基本有序時直接插入排序所需的比較和移動次數均較少。

②當n值較小時,n和n^2的差別也較小,即直接插入排序的最好時間復雜度O(n)和最壞時間復雜度0(n^2)差別不大。

③在希爾排序開始時增量較大,分組較多,每組的記錄數目少,故各組內直接插入較快,後來增量di逐漸縮小,分組數逐漸減少,而各組的記錄數目逐漸增多,但由於已經按di-1作為距離排過序,使文件較接近於有序狀態,所以新的一趟排序過程也較快。

因此,希爾排序在效率上較直接插人排序有較大的改進。

穩定性

希爾排序是不穩定的。參見上述實例,該例中兩個相同關鍵字49在排序前後的相對次序發生了變化。

演算法討論

Shell排序演算法的時間復雜度分析比較復雜,實際所需的時間取決於各次排序時增量的個數和增量的取值。研究證明,若增量的取值比較合理,Shell排序演算法的時間復雜度約為O(n(ldn)2)。由於Shell排序演算法是按增量分組進行的排序,所以Shell排序演算法是一種不穩定的排序演算法。

演算法步驟

Step1 將n個元素個數列分為5個小組,在每個小組內按直接插入法排序;

step2 在第i步,分組個數取 di+1 =(di +1)/2 {9,5,3,2,1};相臨兩組之間的對應元素進行比較,如果ai>aj,則交換它們的位置;

Step3 當dK = 1的循環過程完成後,排序過程結束。

(詳細請查看網路相關條目。)

㈤ shell模型的五大要點

有四大要點,硬體、軟體、環境、人。

1、H,硬體,諸如設備、設施、工具、計算機。

2、S,軟體,運行規則、硬體驅動軟體、指令、法令、程序、文件。

3、E,環境,運作環境、工作場所、自然環境。

4、L,人,人的績效、能力、局限。

相關拓展

在計算機科學中,Shell俗稱殼(用來區別於核),是指「為使用者提供操作界面」的軟體(command interpreter,命令解析器)。它類似於DOS下的COMMAND.COM和後來的cmd.exe。它接收用戶命令,然後調用相應的應用程序。

同時它又是一種程序設計語言。作為命令語言,它互動式解釋和執行用戶輸入的命令或者自動地解釋和執行預先設定好的一連串的命令;作為程序設計語言,它定義了各種變數和參數,並提供了許多在高級語言中才具有的控制結構,包括循環和分支。

在排序演算法中,Shell是希爾排序的名稱。

以上內容參考網路-shell

㈥ 這是一個SHELL排序法的例子,中間有點問題不懂

你好,希爾演算法的基本思想是,利用一個增量序列,讓待排序數組逐漸有序。
針對上面的演算法,其實當gap等於1的時候,shell演算法實際都退化成了簡單插入排序。
至於樓主針對上面的演算法提出的問題,的確,數組的3、4位置一定會比較多次,但是,有可能的是這兩個位置的實際數值,已經不同。因為,先後兩次比較的時候,整個待排序數組的位置已經有了改變。
不過,樓主上面的希爾演算法可以進一步改進。讓其減少無效的比較次數。

㈦ 關於C++中shell(希爾)排序的實現

#include "iostream.h"
void shellSort(int *arr, int len, int *p, int len1);
int main()
{
int num[15]={100,12,20,31,1,5,44,66,61,200,30,80,150,4,8};
int i;
cout<<"待排數據d=(5,3,1): ";
for(i=0;i<15;i++)
{
cout<<num[i]<<" ";
}
int s[3]={5,3,1};
shellSort(num,15, s,3);
cout<<"\n";
return 0;
}

void shellSort(int *arr, int len, int *p, int len1)
{
for (int i = 0; i < len1; i++)
{
int d = p[i];
for (int n = 0; n < d; n ++)
{
for (int j = n + d; j < len; j = j + d)
{
if (arr[j] < arr[j - d])
{
int tmp = arr[j];
for (int k = j - d; k >= 0 && arr[k] > tmp; k = k - d)
{
arr[k + d] = arr[k];
}
arr[k + d] = tmp;
}
}
}
cout<<"第"<<i+1<<"趟排序結果:";
for(int m=0;m<15;m++)
cout<<arr[m]<<" ";
cout<<"\n";
}
}

http://www.cppblog.com/shongbee2/archive/2009/04/25/81046.aspx

#include <stdio.h>
#include <stdlib.h>

//對單個組排序
int SortGroup(int* pnData, int nLen, int nBegin,int nStep)
{
for (int i = nBegin + nStep; i < nLen; i += nStep)
{
//尋找i元素的位置,
for (int j = nBegin; j < i; j+= nStep)
{
//如果比他小,則這里就是他的位置了
if (pnData[i] < pnData[j])
{
int nTemp = pnData[i];
for (int k = i; k > j; k -= nStep)
{
pnData[k] = pnData[k - nStep];
}
pnData[j] = nTemp;
}
}
}
return 1;
}
//希爾排序, pnData要排序的數據, nLen數據的個數
int ShellSort(int* pnData, int nLen)
{
//以nStep分組,nStep每次減為原來的一半。
for (int nStep = nLen / 2; nStep > 0; nStep /= 2)
{
//對每個組進行排序
for (int i = 0 ;i < nStep; ++i)
{
SortGroup(pnData, nLen, i, nStep);
}
}

return 1;
}

int main()
{
int nData[10] = {4,10,9,8,7,6,5,4,3,2}; //創建10個數據,測試
ShellSort(nData, 10); //調用希爾排序

for (int i = 0; i < 10; ++i)
{
printf("%d ", nData[i]);
}

printf("\n");
system("pause");
return 0;
}

㈧ Shell排序的演算法總結

下面幾個演算法有研究價值 /**D.Shell最初的演算法。*/intshellsortSh(intp[],intn){intop=0;inth,i,j,temp;for(h=n/2;h>0;h=h/2){for(i=h;i<n;i++){temp=p[i];for(j=i-h;j>=0&&p[j]>temp;j-=h){p[j+h]=p[j];op++;}p[j+h]=temp;op++;}}returnop;}shell排序演算法C語言實現voidshellsort(intv[],intn){intgap,i,j,temp;for(gap=n/2;gap>0;gap/=2){for(i=gap;i<n;i++){for(j=i-gap;j>=0&&v[j]>v[j+gap];j-=gap){temp=v[j];v[j]=v[j+gap];v[j+gap]=temp;}}}}Lazarus-Frank 演算法,1960 年發表。 /**原為在必要時加1使所有增量都為奇數,現修正為減1。*/intshellsortLF(intp[],intn){intop=0;inth,i,j,temp;for(h=n/2;h>0;h=h/2){if(h%2==0)h--;for(i=h;i<n;i++){temp=p[i];for(j=i-h;j>=0&&p[j]>temp;j-=h){p[j+h]=p[j];op++;}p[j+h]=temp;op++;}}returnop;} intshellsortGo(intp[],intn){intop=0;inth,i,j,temp;for(h=n;h>1;){h=(h<5)?1:(h*5-1)/11;for(i=h;i<n;i++){temp=p[i];for(j=i-h;j>=0&&p[j]>temp;j-=h){p[j+h]=p[j];op++;}p[j+h]=temp;op++;}}returnop;}Incerpj-Sedgewick 演算法,1985 年發表。 intshellsortIS(intp[],intn){intop=0;inth,i,j,t,temp;intincs[16]={/*a1=3,a2=7,a3=16,a4=41,a5=101*/1391376,/*a1*a2*a3*a4*a5*/463792,/*a2*a3*a4*a5*/198768,/*a1*a3*a4*a5*/86961,/*a1*a2*a4*a5*/33936,/*a1*a2*a3*a5*/13776,/*a1*a2*a3*a4*/4592,/*a2*a3*a4*/1968,/*a1*a3*a4*/861,/*a1*a2*a4*/336,/*a1*a2*a3*/112,/*a2*a3*/48,/*a1*a3*/21,/*a1*a2*/7,/*a2*/3,/*a1*/1};for(t=0;t<16;t++){h=incs[t];for(i=h;i<n;i++){temp=p[i];for(j=i-h;j>=0&&p[j]>temp;j-=h){p[j+h]=p[j];op++;}p[j+h]=temp;op++;}}returnop;}

㈨ shell排序比快速排序快嘛

一般情況下快速排序是最快的。
快速排序若選第一個數或一個數為排序基準,而原始數據又基本有序時,會發生退化,效率降低為O(n^2)。此時在大數據下還會發生系統棧溢出。

所以,建議採用隨機數選擇排序基準,基本能保持O(nlog2n)r 高效率。

熱點內容
android鎖屏廣播 發布:2024-10-10 03:21:41 瀏覽:579
上傳說的薩滿卡組 發布:2024-10-10 03:21:35 瀏覽:18
優酷視頻緩存文件 發布:2024-10-10 03:20:54 瀏覽:658
sqlutc時間 發布:2024-10-10 03:19:40 瀏覽:256
陰陽師舉報腳本 發布:2024-10-10 03:18:54 瀏覽:745
蘋果4s手機忘記id密碼怎麼辦 發布:2024-10-10 03:15:59 瀏覽:119
有哪些配置高的小型車 發布:2024-10-10 03:14:53 瀏覽:757
在網上買電腦怎麼選擇配置 發布:2024-10-10 02:46:45 瀏覽:339
控制邏輯演算法 發布:2024-10-10 02:32:22 瀏覽:756
蘭州達內java培訓 發布:2024-10-10 02:31:48 瀏覽:327