深度解析插入排序与归并排序
2017-12-03 10:04
197 查看
此篇为原创,如需转载,请注明出处:http://blog.csdn.NET/qq_36759732
插入排序的基本思想是:每次将一个待排序的记录,按其关键字的大小插入到前面已经排好序的的记录序列中的恰当位置,直到全部记录插完为止。因此又称为增量法。
书本上面利用哨兵防止信息的丢失,在这儿,为了代码的简洁,我加了特判。
编程环境: vim
核心代码:
void insert_sort(int arr[], int n){
for(int i = 1; i < n; ++i){
int t = i;
while(t && arr[t] < arr[t - 1]){ // t 为特判
swap(arr[t], arr[t - 1]);
t--;
}
}
return ;
}
归并排序的基本思想是:把两个后两个以上的有序文件合并起来,形成一个新的有序文件,大学期间常用的是自底向上的2-路归并排序。
编程环境:vim
核心代码:
void merge_sort_my(Data *arr, int l, int r){
int mid = (l + r) / 2;
if(l == r) return ; //只剩1个元素时
if(r - l == 1){ /*还有2个元素时*/
if(cmp_data(arr[l], arr[r])){
swap(arr[l], arr[r]);
}
}
merge_sort_my(arr, l, mid);
merge_sort_my(arr, mid + 1, r);
Data *temp = (Data *)malloc((l + r) *sizeof(Data));
int index1 = 0; //指向前面数组的第一个元素
int index2 = mid + 1; //指向后面数组的第一个元素
int k = 0; //temp数组指针
while(index1 <= l || index2 <= r){ //归并过程
if(index1 > mid){ /*只剩下后面的数组[index2,r]时*/
temp[k++] = arr[index2++];
8e81
}
if(index2 > r){ /*只剩下前面的数组[index1,mid]*/
temp[k++] = arr[index1++];
}
if(cmp_data(arr[index2], arr[index1])){ //后面的第一个大于前面的第> 一个时
temp[k++] = arr[index1++];
}else{
temp[k++] = arr[index2++]; //后面的第一个小于前面的第一个时
}
}
for(int i = l; i <= r; ++i){
arr[i] = temp[i]; //把temp中的元素拷贝到arr中
}
free(temp);
}
以上是我对于插入排序与归并排序的理解,欢迎大家指教与建议。
插入排序的基本思想是:每次将一个待排序的记录,按其关键字的大小插入到前面已经排好序的的记录序列中的恰当位置,直到全部记录插完为止。因此又称为增量法。
书本上面利用哨兵防止信息的丢失,在这儿,为了代码的简洁,我加了特判。
编程环境: vim
核心代码:
void insert_sort(int arr[], int n){
for(int i = 1; i < n; ++i){
int t = i;
while(t && arr[t] < arr[t - 1]){ // t 为特判
swap(arr[t], arr[t - 1]);
t--;
}
}
return ;
}
归并排序的基本思想是:把两个后两个以上的有序文件合并起来,形成一个新的有序文件,大学期间常用的是自底向上的2-路归并排序。
编程环境:vim
核心代码:
void merge_sort_my(Data *arr, int l, int r){
int mid = (l + r) / 2;
if(l == r) return ; //只剩1个元素时
if(r - l == 1){ /*还有2个元素时*/
if(cmp_data(arr[l], arr[r])){
swap(arr[l], arr[r]);
}
}
merge_sort_my(arr, l, mid);
merge_sort_my(arr, mid + 1, r);
Data *temp = (Data *)malloc((l + r) *sizeof(Data));
int index1 = 0; //指向前面数组的第一个元素
int index2 = mid + 1; //指向后面数组的第一个元素
int k = 0; //temp数组指针
while(index1 <= l || index2 <= r){ //归并过程
if(index1 > mid){ /*只剩下后面的数组[index2,r]时*/
temp[k++] = arr[index2++];
8e81
}
if(index2 > r){ /*只剩下前面的数组[index1,mid]*/
temp[k++] = arr[index1++];
}
if(cmp_data(arr[index2], arr[index1])){ //后面的第一个大于前面的第> 一个时
temp[k++] = arr[index1++];
}else{
temp[k++] = arr[index2++]; //后面的第一个小于前面的第一个时
}
}
for(int i = l; i <= r; ++i){
arr[i] = temp[i]; //把temp中的元素拷贝到arr中
}
free(temp);
}
以上是我对于插入排序与归并排序的理解,欢迎大家指教与建议。
相关文章推荐
- 深度解析ASP.NET2.0中的Callback机制
- 源码深度解析SpringMvc请求运行机制
- C语言深度解析(四)
- 深度解析MFC线程及机制
- 深度解析Java内存的原型(转)
- BF&KMP算法深度解析
- 模板方法模式深度解析(三)
- Cookie深度解析
- yarn关于app max attempt深度解析,针对长服务appmaster平滑重启
- JavaScript中对象进行深度clone,url参数解析
- 深度解析VC中的消息
- 资源 |《解析卷积神经网络—深度学习实践手册》
- 2018年网易深度学习图像实习校招编程题(100%案例通过)python解析
- 深度解析struts2的valueStack
- 【11】Java集合:HashMap深度解析(一)
- 深度解析单例与序列化之间的爱恨情仇~
- 【HTML5教程】微信小程序全方位深度解析【完结】
- Mutex, semaphore, spinlock的深度解析
- SQL注入原理深度解析
- Docker背后的容器管理——Libcontainer深度解析