C++ 设计算法实现双向起泡排序。

题目:

设计算法实现双向起泡排序。

实现代码:

源文件代码:

#include<iostream>
#include<cstdio>
#include<malloc.h>
#include<cstdlib>
#include"Recsort.h"
#include<ctime>

using namespace std;

void insert_sort(RecType r[], int n) {
	int i, j;
	RecType tmp;
	for (i = 1; i < n; ++i) {
		if (r[i].key < r[i - 1].key) {		
			tmp = r[i];
			j = i - 1;
			do {
				r[j + 1] = r[j];
				j--;
			} while (j >= 0 && r[j].key > tmp.key);
			r[j + 1] = tmp;
		}
	}
}

void binary_insert_sort(RecType r[], int n) {
	int i, low, high, mid, j;
	RecType tmp;
	for (i = 1; i < n; ++i) {
		if (r[i].key < r[i - 1].key) {		
			tmp = r[i];
			low = 0, high = i - 1;
			while (low <= high) {
				mid = (low + high) / 2;
				if (tmp.key < r[mid].key)
					high = mid - 1;
				else
					low = mid + 1;
			}
			for (j = i - 1; j >= high + 1; j--)
				r[j + 1] = r[j];
			r[high + 1] = tmp;
		}
	}
}

void shell_sort(RecType r[], int n) {
	int i, j, d;
	RecType tmp;
	d = n / 2;
	while (d > 0) {
		for (i = d; i < n; ++i) {		
			tmp = r[i];
			j = i - d;
			while (j >= 0 && tmp.key < r[j].key)
			{
				r[j + d] = r[j];
				j = j - d;
			}
			r[j + d] = tmp;
		}
		d = d / 2;
	}
}

void bubble_sort(RecType r[], int n) {
	int i, j;
	bool exchange;
	for (i = 0; i < n; ++i) {
		exchange = false;
		for (j = n - 1; j > i; --j)
			if (r[j].key < r[j - 1].key) {
				swap(r[j], r[j - 1]);
				exchange = true;
			}
		if (!exchange)
			return;
	}
}

int partition(RecType r[], int s, int t) {
	int i = s, j = t;
	RecType base = r[i];	
	while (i < j) {		
		while (i < j && r[j].key >= base.key)		
			--j;
		if (i < j) {
			r[i] = r[j];
			++i;
		}
		while (i < j && r[i].key <= base.key)		
			++i;
		if (i < j) {
			r[j] = r[i];
			--j;
		}
	}
	r[i] = base;
	return i;
}

void quick_sort(RecType r[], int s, int t) {
	int i;
	if (s < t) {
		i = partition(r, s, t);
		quick_sort(r, s, i - 1);
		quick_sort(r, i + 1, t);
	}
}

void select_sort(RecType r[], int n) {
	int i, j, k;
	for (i = 0; i < n; ++i) {
		k = i;
		for (j = i + 1; j < n; ++j)
			if (r[j].key < r[k].key)
				k = j;
		if (k != i)
			swap(r[k], r[i]);

	}
}

void sift(RecType r[], int low, int high) {
	int i = low + 1, j = 2 * i;
	RecType tmp = r[i - 1];
	while (j <= high + 1) {
		if (r[j - 1].key < r[j].key && j < high + 1)
			++j;
		if (tmp.key < r[j - 1].key) {
			r[i - 1] = r[j - 1];
			i = j;
			j = 2 * i;
		}
		else
			break;
	}
	r[i - 1] = tmp;
}

void heap_sort(RecType r[], int n) {
	int i;
	for (i = n / 2 - 1; i >= 0; --i)
		sift(r, i, n);
	for (i = n - 1; i >= 1; i--) {
		swap(r[0], r[i]);
		sift(r, 0, i - 1);
	}
}

void merge(RecType r[], int low, int mid, int high) {	
	RecType* r1;
	int i = low, j = mid + 1, k = 0;
	r1 = (RecType*)malloc((high - low + 1) * sizeof(RecType));
	while (i <= mid && j <= high) {		
		if (r[i].key <= r[j].key) {
			r1[k] = r[i];
			++i; ++k;
		}
		else {
			r1[k] = r[j];
			++j; ++k;
		}
	}
	while (i <= mid) {
		r1[k] = r[i];
		++i; ++k;
	}
	while (j <= high) {
		r1[k] = r[j];
		++j; ++k;
	}
	for (k = 0, i = low; i <= high; ++k, ++i)
		r[i] = r1[k];
	free(r1);
}

void merge_pass(RecType r[], int length, int n) {		
	int i;
	for (i = 0; i + 2 * length - 1 < n; i = i + 2 * length)
		merge(r, i, i + length - 1, i + 2 * length - 1);
	
	if (i + length - 1 < n - 1)
		merge(r, i, i + length - 1, n - 1);
}

void merge_sort(RecType r[], int n) {
	int length;
	for (length = 1; length < n; length *= 2) {
		merge_pass(r, length, n);
	}
}


void radix_sort(Nodetype*& p, int r, int d) {
	Nodetype* head[MAX], * tail[MAX], * t = p;
	int i, j, k;
	for (i = 0; i < d; ++i) {
		for (j = 0; j < r; ++j)		
			head[j] = tail[j] = NULL;
		while (p != NULL) {			
			k = p->data[i] - '0';
			if (head[k] == NULL) {
				head[k] = p;
				tail[k] = p;
			}
			else {
				tail[k]->next = p;	
				tail[k] = p;
			}
			p = p->next;
		}
		p = NULL;
		for (j = 0; j < r; ++j) {
			if (head[j] != NULL) {
				if (p == NULL) {		
					p = head[j];
					t = tail[j];
				}
				else {
					t->next = head[j];
					t = tail[j];
				}
			}
		}
		t->next = NULL;
	}
}

头文件代码:
 

#pragma once
#ifndef RECSORT_H

#include"student.h"
typedef char InfoType;
typedef float KeyType;
#define MAX 500
typedef struct
{
	KeyType key;
	int num;
	char name[MAX1];
	int math_grade;
	int linear_algebra_garde;
	int english_grade;
	int physical_grade;
}RecType;

typedef struct node
{
	char data[MAX];
	struct node* next;
}Nodetype;

void insert_sort(RecType r[], int n);

void binary_insert_sort(RecType r[], int n);

void shell_sort(RecType r[], int n);

void bubble_sort(RecType r[], int n);

void quick_sort(RecType r[], int s, int t);

void select_sort(RecType r[], int n);

void heap_sort(RecType r[], int n);

void merge_sort(RecType r[], int n);
#endif 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值