當前位置:首頁 » 操作系統 » 直接插入演算法

直接插入演算法

發布時間: 2022-02-06 00:06:05

① 直接插入排序是固定那個演算法

排序演算法包括插入、交換、選擇、歸並等。
插入演算法的共性(直接、二分、希爾插入演算法)是移動數據並找到插入點,再交換數據以插入。
插入演算法的特性體現在如何找到插入點。
應該說直接插入演算法的思想是固定的,無論你具體怎麼實現。
你那不是插入排序,算是交換吧。

② 誰能給我幾種排序的具體演算法(直接插入,折半插入,冒泡,簡單選擇,快速,堆,歸並排序)

直接插入排序
說明:逐個將後一個數加到前面的排好的序中。在直接插入排序過程中,對其中一個記錄的插入排序稱為一次

排序;直接插入排序是從第二個記錄開始進行的,因此,長度為n的記錄序列需要進行n-1次排序才能完成整個

序列的排序。時間復雜度為O(n2)。
void InsertSort(elemtype x[],int n)
/*用直接插入法對x[0]-x[n-1]排序*/
{
int i,j;
elemtype s;
for(i=0;i<n-1;i++)
{
s=x[i+1];
j=i;
while(j>-1&&s.key<x[j].key)
{
x[j+1]=x[j];
j--;
}
x[j+1]=s;
}
}

---------------------
希爾排序
說明:希爾排序又稱縮小增量排序,增量di可以有各種不同的取法,但最後一次排序時的增量必須為1,最簡

單可取di+1=di/2(取小)。時間復雜度為O(n(log2n)2)。

void ShellSort(elemtype x[],int n,intd[],int Number)
/*用希爾排序法對記錄x[0]-x[n-1]排序,d為增量值數組*/
/*Number為增量值個數,各組內採用直接插入法排序*/
{
int i,j,k,m,Span;
elemtype s;
for(m=0;m<Number;m++)
{
Span=d[m];
for(k=0;k<Span;k++)
{
for(i=k;i<n-1;i+=Span)/*這個for之後的是「組內採用直接插入法排序」*/
{
s=x[i+Span];
j=i;
while(j>-1&&s.key<x[j].key)
{
x[j+Span]=x[j];
j-=Span;
}
x[j+Span]=s;
}
}
}
}

----------------------------
直接選擇排序
說明:每次將後面的最小的找出來插入前面的已排好的序中。同理,具有n個記錄的序列要做n-1次排序。
時間復雜度為O(n2)。
void SelectSort(elemtype x[],int n)
/*用直接選擇排序法對x[0]-x[n-1]排序*/
{
int i,j,Small;
elemtype Temp;
for(i=0;i<n-1;i++)
{
Small=i;
for(j=i+1;j<n;j++)
if(x[j].key<x[Small].key)
Small=j;

if(Small!=i)
{
Temp=x[i];
x[i]=x[Small];
x[Small]=Temp;
}
}
}

--------------------------
冒泡排序
說明:兩個兩個比較,將大的往後移。通過第一次冒泡排序,使得待排序的n個記錄中關鍵字最大的記錄排到

了序列的最後一個位置上。然後對序列中前n-1個記錄進行第二次冒泡排序。。。對於n個記錄的序列,共需進

行n次冒泡排序。時間復雜度為O(n2)。

void BubbleSort(elemtype x[],int n)
/*用冒泡排序法對x[0]-x[n-1]排序*/
{
int i,j,flag=1;
elemtype Temp;
for(i=1;i<n&&flag==1;i++)
{
flag=0;
for(j=0;j<n-i;j++)
{
if(x[j].key>x[j+1].key)
{
flag=1;
Temp=x[j];
x[j]=x[j+1];
x[j+1]=Temp;
}
}
}
}

-----------------------------
快速排序
說明:又叫分區交換排序,是對冒泡排序方法的一種改進。時間復雜度為O(nlog2n)。

void QuickSort(elemtype x[],int low,int high)
/*用遞歸方法對記錄x[0]-x[n-1]進行快速排序*/
{
int i,j;
elemtype Temp;

i=low;
j=high;
Temp=x[low];

while(i<j)
{
/*在序列的右端掃描*/
while(i<j&&Temp.key<=x[j].key)j--;
if(i<j)
{
x[i]=x[j];
i++;
}

/*在序列的左端掃描*/
while(i<j&&x[i].key<Temp.key)i++;
if(i<j)
{
x[j]=x[i];
j--;
}
}
x[i]=Temp;

/*對子序列進行快速排序*/
if(low<i-1)QuickSort(x,low,i-1);
if(j+1<high)QuickSort(x,j+1,high);
}

-------------------------
歸並排序
說明:所謂歸並排序就是將兩個或兩個以上的有序數據序列合並成一個有序數據序列的過程。
時間復雜度為O(nlog2n)。

void merge(r,l,m,h,r1,r2)/*r[l,m]及r[m+1,h]分別有序,歸並後置於r2中*/
sqlist r,r2;
int l,m,h;
{
int i,j,k;
k=l;/*k是r2的指示器,i、j分別為s1、s2的指示器*/
i=l;
j=m+1;

while(i<=m&&j<=h)
{
if(r[i].key<=r[j].key)
{
r2[k]=r[i];
i++;
}
else
{
r2[k]=r[j];
j++;
}
k++;
}
if(i>m) /*s1結束*/
while(j<=h)
{
r2[k]=r[j];
j++;k++;
}
else
while(i<=m)
{
r2[k]=r[i];
i++;k++;
}
}

③ 直接插入排序演算法實現問題

雖然沒學過java但是你的演算法錯了
while(j>=0&&a[j]>a[i]){a[j+1]=a[j];j--;}

這里的a[i]沒有存下來,應該是x=a[i];然後while(......a[j]>x);

④ 一道數據結構,直接插入演算法的代碼。

for(i=2;i<=n;i++)//循環從第2個元素開始
{ R[0]=R[i];
for(j=i-1;R[j]>R[0];j--)
R[j+1]=R[j];
R[j+1]=R[0];
}

⑤ Java 直接插入 排序演算法 要怎麼應用

直接插入排序流程如下:
1、首先比較數組的前兩個數據,並排序;
2、比較第三個元素與前兩個排好序的數據,並將第三個元素放入適當的位置;
3、比較第四個元素與前三個排好序的數據,並將第四個元素放入適當的位置;
......
4、直至把最後一個元素放入適當的位置。
舉例說明:要排序數組:int[] arr = {7, 2, 6, 5, 9, 4};
第1趟後:[2, 7], 6, 5, 9, 4
第2趟後:[2, 6, 7], 5, 9, 4
第3趟後:[2, 5, 6, 7], 9, 4
第4趟後:[2, 5, 6, 7, 9], 4
第5趟後:[2, 4, 5, 6, 7, 9]
演算法分析
空間復雜度O(1)
時間復雜度O(n2)
最差情況:反序,需要移動n*(n-1)/2個元素
最好情況:正序,不需要移動元素
數組在已排序或者是「近似排序」時,插入排序效率的最好情況運行時間為O(n);
插入排序最壞情況運行時間和平均情況運行時間都為O(n2)。
通常,插入排序呈現出二次排序演算法中的最佳性能。
對於具有較少元素(如n<=15)的列表來說,二次演算法十分有效。

⑥ 編寫程序用直接插入排序的演算法進行排序。

#include<stdio.h>
#include<time.h>
#include<math.h>
#include<malloc.h>

void BubbleSort(int *L,int N)
{ //冒泡
int i,j;
int t;

for(i=1;i<=N;i++)
{
for(j=N;j>i;j--)
if(L[j]<L[j-1])
{
t=L[j];
L[j]=L[j-1];
L[j-1]=t;
}
}
}

int SelectMinKey(int *L,int N,int n)
{
int i,min=n;

for(i=n+1;i<=N;i++)
if(L[i]<L[min])
min=i;

return min;
}

void SelectSort(int *L,int N)
{ //選擇
int i,j;
int t;

for(i=1;i<N;i++)
{
j=SelectMinKey(L,N,i);
if(i!=j)
{
t=L[i];
L[i]=L[j];
L[j]=t;
}
}
}

void InsertSort(int *L,int N)
{ //插入
int i,j;

for(i=2;i<=N;i++)
{
if(L[i]<L[i-1])
{
L[0]=L[i];
L[i]=L[i-1];
for(j=i-2;L[0]<L[j];j--)
L[j+1]=L[j];
L[j+1]=L[0];
}
}
}

void ShellInsert(int *L,int N, int dk)
{ // 對順序表L作一趟希爾插入排序。本演算法對演算法10.1作了以下修改:
// 1. 前後記錄位置的增量是dk,而不是1;
// 2. r[0]只是暫存單元,不是哨兵。當j<=0時,插入位置已找到。
int i,j;
for(i=dk+1;i<=N;++i)
if(L[i]<L[i-dk])
{ // 需將L.r[i]插入有序增量子表
L[0]=L[i]; // 暫存在L.r[0]
for(j=i-dk;(j>0&&L[0]<L[j]);j-=dk)
L[j+dk]=L[j]; // 記錄後移,查找插入位置
L[j+dk]=L[0]; // 插入
}
} // ShellInsert

void ShellSt(int *L,int N, int dlta[], int t)
{ // 演算法10.5
// 按增量序列dlta[0..t-1]對順序表L作希爾排序。
for(int k=0;k<t;++k)
ShellInsert(L,N, dlta[k]); // 一趟增量為dlta[k]的插入排序
} // ShellSort

void ShellSort(int *L,int N)
{ //希爾
int t=(int)log(N);
int k,*dlta;

dlta=(int*)malloc(t*4); //產生增量序列
for(k=0;k<t;k++)
dlta[k]=(int)pow(2,t-k)-1;

ShellSt(L,N,dlta,t);
}

int main()
{
int N=250;
int i,j,k;
int t;
int ti[16];
int *L;

srand(time(NULL));

printf("長度\t|冒泡\t|選擇\t|插入\t|希爾\n");
printf("--------+-------------------------------------------------------------");
for(j=0;N<100000;j++)
{
L=(int *)malloc((N+1)*4);

t=0;

for(i=1;i<=N;i++)
L[i]=rand();
ti[t++]=clock();
BubbleSort(L,N);
ti[t++]=clock();

for(i=1;i<=N;i++)
L[i]=rand();
ti[t++]=clock();
SelectSort(L,N);
ti[t++]=clock();

for(i=1;i<=N;i++)
L[i]=rand();
ti[t++]=clock();
InsertSort(L,N);
ti[t++]=clock();

for(i=1;i<=N;i++)
L[i]=rand();
ti[t++]=clock();
ShellSort(L,N);
ti[t++]=clock();

printf("\n%d\t",N);
for(k=0;k<4;k++)
printf("| %d\t",(ti[2*k+1]-ti[2*k]));

N*=5;
}
printf("\n\n");
}

//這是我們當年學數據結構時我自己寫的,給你改了一下,輸出是對隨機產生一些數,對四種演算法進行比較,有問題可以hi我啊

⑦ 直接插入演算法排序問題150

選D
因為本來就有序了, 每個元素(除了第一個)和它前面的一個比較一下就行了, 一共(n-1)次

⑧ 關於直接插入排序演算法

感覺你寫的有點復雜了,這是我用pasical寫的插入排序演算法,你看看對比一下
for j:=2 to 5 do
begin
Temp := MyArr[j];
{注意如果不用i代替j的話,dec無法通過編譯因為j的值即增有減是錯誤的}
i := j;
dec(i);
while MyArr[i] > Temp do
begin
MyArr[i+1] := MyArr[i];
Dec(i);
end;
MyArr[i+1] := Temp;
end;

熱點內容
python解析json文件 發布:2024-10-18 11:29:34 瀏覽:310
編譯程序的生成程序 發布:2024-10-18 11:29:27 瀏覽:403
軌跡處理演算法 發布:2024-10-18 11:22:25 瀏覽:782
支付密碼怎麼破解 發布:2024-10-18 11:09:19 瀏覽:144
線性鏈表c語言 發布:2024-10-18 11:09:17 瀏覽:784
淘寶賣的腳本可靠嗎 發布:2024-10-18 10:54:04 瀏覽:119
數質數演算法 發布:2024-10-18 10:53:26 瀏覽:281
安卓11有的地方怎麼那麼卡 發布:2024-10-18 10:53:21 瀏覽:478
蘋果怎麼設置程序加密 發布:2024-10-18 10:52:41 瀏覽:101
idea重啟自動編譯 發布:2024-10-18 10:52:41 瀏覽:448