看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...