由于使用的引用请在c++环境中运行
typedef struct
{
KeyType key; //关键字项
InfoType otherinfo; //其他数据项
}RedType;
typedef struct
{
RedType r[MaxSize + 1]; //r[0]闲置或做哨兵单元
int length; //顺序表的长度
}SqList; //顺序表类型
void mergePass(SqList& R, SqList& MR, int first, int mid, int last) {
int i = first, j = mid + 1, m = mid, n = last;
int k = 0;
while (i <= m && j <= n) {
if (R.r[i].key < R.r[j].key) {
MR.r[k++] = R.r[i++];
}
else
{
MR.r[k++] = R.r[j++];
}
}
while (i <= m) {
MR.r[k++] = R.r[i++];
}
while (j <= n) {
MR.r[k++] = R.r[j++];
}
for (i = 0; i < k; i++) {
R.r[first + i] = MR.r[i];
}
}
void Merge(SqList& R, SqList& MR, int first,int last) {
if(first<last){
int mid = (first + last) / 2;
Merge(R, MR, first, mid);
Merge(R, MR, mid+1, last);
mergePass(R, MR, first, mid, last);
}
}
int main()
{
//归并排序
SqList L;
L.length = 5;
L.r[0].key = 19;
L.r[1].key = 15;
L.r[2].key = 37;
L.r[3].key = 12;
L.r[4].key = 25;
SqList LT;
LT.length = 5;
for (int i = 0; i < L.length; i++)
printf("%d ", L.r[i].key);
printf("\n");
Merge(L, LT, 0, 4);
for (int i = 0; i < L.length; i++)
printf("%d ", L.r[i].key);
printf("\n");
}
java 实现请看
https://zhuanlan.zhihu.com/p/36075856
另外一种java 的实现方式
import java.util.ArrayList; import java.util.List; /** * @Date: 2020/12/26 13:56 */ public class GuiBingSort { public static void mergePass(List<Integer> list, List<Integer> listCopy, int first, int mid, int last) { int i = first; int j = mid + 1; int m = mid; int n = last; int k = 0; while (i <= m && j <= n) { if (list.get(i) < list.get(j)) { listCopy.set(k++, list.get(i++)); } else { listCopy.add(k++, list.get(j++)); } } while (i <= m) { listCopy.add(k++, list.get(i++)); } while (j <= n) { listCopy.add(k++, list.get(j++)); } for (i = 0; i < k; i++) { list.set(first + i, listCopy.get(i)); } } public static void merge(List<Integer> list, List<Integer> listCopy, int first, int last) { if (first < last) { int mid = (first + last) / 2; merge(list, listCopy, first, mid); merge(list, listCopy, mid + 1, last); mergePass(list, listCopy, first, mid, last); } } public static void main(String[] args) { List<Integer> list = new ArrayList<>(); List<Integer> listcopy = new ArrayList<>(); list.add(0, 19); list.add(1, 15); list.add(2, 37); list.add(3, 12); list.add(4, 25); System.out.println("归并排序:"); System.out.println("排序前:"); for (int i = 0; i < list.size(); i++) { System.out.print(list.get(i) + " "); } System.out.println(); merge(list, listcopy, 0, list.size() - 1); System.out.println("排序后:"); for (int i = 0; i < list.size(); i++) { System.out.print(list.get(i) + " "); } } }