归并排序
思想:
- 分解:将n个元素分成个含n/2个元素的子序列。
- 解决:用合并排序法对两个子序列递归的排序。
- 合并:合并两个已排序的子序列已得到排序结果。
递归实现板子:
void merge_sort_recursive(int arr[], int reg[], int start, int end) {
if (start >= end)
return;
int len = end - start, mid = (len >> 1) + start;
int start1 = start, end1 = mid;
int start2 = mid + 1, end2 = end;
merge_sort_recursive(arr, reg, start1, end1);
merge_sort_recursive(arr, reg, start2, end2);
int k = start;
while (start1 <= end1 && start2 <= end2)
reg[k++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++];
while (start1 <= end1)
reg[k++] = arr[start1++];
while (start2 <= end2)
reg[k++] = arr[start2++];
for (k = start; k <= end; k++)
arr[k] = reg[k];
}
void merge_sort(int arr[], const int len) {
int reg[len];
merge_sort_recursive(arr, reg, 0, len - 1);
}
希尔排序
思想:
将整个待排序列分割成若干个子序列(由相隔增量个元素组成),分别进行直接插入排序,然后依次缩小增量再进行排序,待整个序列中的元素基本有序时,再对全体元素进行一次直接插入排序。
希尔排序的实现应该由三个循环完成
(1)第一次循环,将增量d依次折半,直到增量d=1
(2)第二三层循环,也就是直接插入排序所需要的两次循环。
实现板子:
#include <stdio.h>
#define N 9
int main(void)
{
int arr[N] = {2,5,6,8,7,9,3,5,1};
int d = N / 2; //取一半
int i,j,insertVal;
/三层循环
while(d>=1) //大于等于1,插入排序
{
//直接插入排序代码
for(i=d; i<N; i++)
{
insertVal = arr[i];
j = i - d;
while(j>=0 && arr[j]>insertVal)
{
arr[j+d] = arr[j];
j = j - d;
}
arr[j+d] = insertVal;
}
d = d / 2;
}
for(i=0; i<N; i++)
{
printf("%d ",arr[i]);
}
return 0;
}