插入排序與歸併排序及優化

2021-07-08 19:37:38 字數 2562 閱讀 3534

看clrs順便做下筆記總結一下,理清思路。(所有排序例子皆為從小到大,各位覺得**能更好地改進都可以指出來)

插入排序(c語言實現)

最壞情況下的執行時間是θ(n*n),跟氣泡排序,選擇排序的最壞情況下的執行時間是相同的

但是,運算的速度 插入》選擇(相比冒泡交換的次數較少)>冒泡

最簡單的例子啦,打牌的時候一張一張的拿到手裡插入排序。

上**

#include

#include

int main(void)

for(i=1;i//你拿到的「牌」

j=i-1;//通過迭代找到合適的位置,將其他牌向前推

while(j>=0&&ptr[j]>key)

ptr[j+1]=key;//最後把牌放進去

}for(i=0;iprintf("%d ",ptr[i]);

}free(ptr);

return

0;}

以上的方法是從迭代實現插入排序

那麼我們試下遞迴實現插入排序

#include

#include

void insert_sort(int

*ptr,int num);

int main(void)

insert_sort(ptr,num-1);

for(i=0;iprintf("%d ",ptr[i]);

}free(ptr);

return0;}

void insert_sort(int

*ptr,int num)

ptr[i+1]=key;

index++;

if(index

歸併排序(c語言實現)

採用的是分治的思想divide and conquer

最壞情況下的執行時間是θ(n*ign),其中ign相比任何的線性函式增長慢,所以歸併排序的效能要優於插入排序。

歸併排序就等於畫樹,其中樹的每一層加起來都等於cn,樹的高度一共是ign層,merge的子程式耗費的時間是θ(n)

一共加起來的時間就是cn*lgn+θ(n),通過漸近符號得到最高項就是θ(n*ign)

上**(這裡的歸併排序並沒有採用哨兵的方法)

#include

#include

#include

void merge_sort(int

*ptr,int low,int high);

void merge(int

*ptr,int leftlow,int lefthigh,int rightlow,int righthigh);

int main(void)

merge_sort(ptr,0,size-1);

for(index=0;index

index++)

free(ptr);

return0;}

void merge_sort(int

*ptr,int low,int high)

}void merge(int

*ptr,int leftlow,int lefthigh,int rightlow,int righthigh)

else

}while(leftindex<=lefthigh)

while(rightindex<=righthigh)

memcpy(ptr+leftlow,sort_array,num*sizeof(int));

free(sort_array);

}

那麼,就如函式y=n*n與函式y』=n*n*n一樣存在乙個點,使得小於該點時y

#include

#include

#include

#define max 30

void merge_sort(int *,int ,int );

void merge(int *,int ,int ,int ,int );

void insert_sort(int *,int ,int );

int main(void)

merge_sort(ptr,0,size-1);

for(i=0;iprintf("%d ",ptr[i]);

}free(ptr);

return0;}

void merge_sort(int *ptr,int low,int high)

else

if((high-low)>max)

}void insert_sort(int *ptr,int low,int high)

ptr[i+1]=key;

}}void merge(int *ptr,int leftlow,int lefthigh,int rightlow,int righthigh)

}while(leftindex<=lefthigh)

while(rightindex<=righthigh)

memcpy(ptr+leftlow,sort_array,size*sizeof(int));

free(sort_array);

}

插入排序與歸併排序

關於排序似乎從大一開始學習變成就開始在使用各種排序方法了,今天看了下有關於插入排序和歸併排序的內容,並且對應在leetcode 上面做了兩道測試題,因此就對插入排序和歸併排序做乙個簡單的小結吧,就當做是我的學習筆記,大佬請勿嘲笑!關於插入排序主要的思想就是從左到右的遍歷乙個序列,有乙個標識來標記,保...

插入排序 歸併排序

插入排序 define len 5 int a len void insertion sort void int i,j,k for j 1 j len j k a j i j 1 while i 0 a i k a i 1 a i i a i 1 k 歸併排序 int a 8 void merge...

插入排序 歸併排序

演算法導論初涉,第一講練習內容 include define n 6 int a n void init 初始化陣列 a i 1 k void output int a,int n void merge int low,int mid,int high while s mid b i a s whi...