c++顺序表常见排序的写法(堆排序,选择,直接插入,冒泡,快排,归并)

话不多说,直接上代码。

#include<iostream>
#include<cstdlib>
#define MAXNUM 10
using namespace std;
typedef int KeyType;
//顺序表定义
typedef struct {
	KeyType key;
	//DataType info;
}ElemType;
typedef struct {
	ElemType data[MAXNUM];
	int n;
}SqList;
//顺序表初始化 
void initList(SqList* L, int n, int list[]) {
	int i;
	for (i = 1; i <= n; i++)
		L->data[i].key = list[i - 1];
	L->n = n;
}
//冒泡排序 
void bubbleSort(SqList* L) {
	ElemType temp;
	for (int i = 1; i < L->n; i++) {
		bool flag = false;
		for (int j = 1; j <= L->n - i; j++) {
			if (L->data[j].key > L->data[j + 1].key) {
				temp = L->data[j + 1];
				L->data[j + 1] = L->data[j];
				L->data[j] = temp;
				flag = true;
			}
		}
		if (!flag) break;
	}
}
//堆调整
void heapAdjust(SqList* L, int s, int m) {
	ElemType r;
	r = L->data[s];
	for (int j = s * 2; j <= m; j *= 2) {
		if (j < m && L->data[j].key < L->data[j + 1].key) j++;
		if (r.key >= L->data[j].key) break;
		L->data[s] = L->data[j];
		s = j;
	}
	L->data[s] = r;
}
//建堆
void createHeap(SqList* L) {
	for (int i = L->n / 2; i > 0; i--)
		heapAdjust(L, i, L->n);
}
//堆排序 
void heapSort(SqList* L) {
	createHeap(L);
	for (int i = L->n; i > 1; i--) {
		ElemType x = L->data[1];
		L->data[1] = L->data[i];
		L->data[i] = x;
		heapAdjust(L, 1, i - 1);
	}
}
//选择排序
int selectMinKey(SqList L, int i) {
	int k, min = L.data[i].key, min_index = i;
	for (k = i + 1; k <= L.n; k++)
		if (min > L.data[k].key) {
			min = L.data[k].key;
			min_index = k;
		}
	return min_index;
}
void selectSort(SqList* L) {
	int i, j;
	ElemType temp;
	for (i = 1; i < L->n; i++) {
		j = selectMinKey(*L, i);
		if (i != j) {
			temp = L->data[j];
			L->data[j] = L->data[i];
			L->data[i] = temp;
		}
	}
}
//直接插入排序
void insertSort(SqList* L) {
	int j;
	for (int i = 2; i <= L->n; i++) {
		if (L->data[i].key < L->data[i - 1].key) {
			L->data[0] = L->data[i];
			L->data[i] = L->data[i - 1];
			for (j = i - 2; L->data[0].key < L->data[j].key; j--)
				L->data[j + 1] = L->data[j];
			L->data[j + 1] = L->data[0];
		}
	}
}
//快排
int rePart(SqList* L, int low, int high) {
	int pKey;
	L->data[0] = L->data[low];
	pKey = L->data[low].key;
	while (low < high) {
		while (low < high && L->data[high].key >= pKey) high--;
		L->data[low] = L->data[high];
		while (low < high && L->data[low].key <= pKey) low++;
		L->data[high] = L->data[low];
	}
	L->data[low] = L->data[0];
	return low;
}
//快速排序 
void quickSort(SqList* L, int low, int high) {
	int pKey;
	if (low < high) {
		pKey = rePart(L, low, high);
		quickSort(L, low, pKey - 1);
		quickSort(L, pKey + 1, high);
	}
}
//归并
void merge(ElemType r[], ElemType r1[], int low, int m, int high) {
	int i, j, k; i = low;  j = m + 1;  k = low;
	while ((i <= m) && (j <= high)) {
		if (r[i].key <= r[j].key) r1[k++] = r[i++];
		else  r1[k++] = r[j++];
	}
	while (i <= m)  r1[k++] = r[i++];
	while (j <= high)  r1[k++] = r[j++];
}
//一趟归并
void mergePass(ElemType r[], ElemType r1[], int n, int h) {
	int i, j; i = 1;
	while (i + 2 * h <= n) {
		merge(r, r1, i, i + h - 1, i + 2 * h - 1);
		i += 2 * h;
	}
	if (i + h <= n) merge(r, r1, i, i + h - 1, n);
	else
		for (j = i; j <= n; j++)
			r1[j] = r[j];
}
//归并排序
void mergeSort(SqList* L) {
	ElemType r1[MAXNUM];
	int h; h = 1;
	while (h <= L->n) {
		mergePass(L->data, r1, L->n, h);
		h *= 2;
		mergePass(r1, L->data, L->n, h);
		h *= 2;
	}
}
//输出 
void print(SqList* L) {
	int i;
	for (i = 1; i <= L->n; i++)
		cout << L->data[i].key << " ";
	cout << endl;
}
int main() {
	SqList L;
	int a[] = { 49,38,65,97,76,13,27,10 };
	//堆排序
	initList(&L, 8, a);
	heapSort(&L);
	cout << "堆排序:  ";
	print(&L);
	//选择排序 
	initList(&L, 8, a);
	selectSort(&L);
	cout << "选择排序:";
	print(&L);
	//直接插入
	initList(&L, 8, a);
	insertSort(&L);
	cout << "直接插入:";
	print(&L);
	//冒泡 
	initList(&L, 8, a);
	bubbleSort(&L);
	cout << "冒泡排序:";
	print(&L);
	//快排 
	initList(&L, 8, a);
	quickSort(&L, 1, 8);
	cout << "快速排序:";
	print(&L);
	//归并 
	initList(&L, 8, a);
	mergeSort(&L);
	cout << "归并排序:";
	print(&L);
	return 0;
}

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用c++实现的顺序:多文件编程,层次清晰,函数有注释 SeqList();//构造函数,存储的元素个数设为0 bool setLength(size_t length);//设置已经存储的元素个数 bool addElement(ElemType element);//把某个元素添加到顺序末尾 bool addElement(ElemType element , size_t n);//插入一个元素,使其成为第n个元素,其余元素后移 bool delElement();//删除所有的元素 bool delElement(size_t n);//删除第n个元素 bool delElement(string elementDetailType,string elementDetail);//通过某个元素细节找到元素,把这个元素删除 bool replaceElement(ElemType element , size_t n);//使用一个元素,替换掉第n个元素 bool swapElement(size_t n1 , size_t n2);//把第n1个元素和第n2个元素交换 ElemType* getElement();//得到数组头的指针 ElemType* getElement(size_t n);//得到第n个元素的指针 size_t getLength();//得到存储的元素个数 size_t getMaxSize();//得到顺序容量 bool showElementDetail();//输出所有的元素细节 bool showElementDetail(size_t n);//输出第n个元素的细节 bool showElementDetail(string elementDetailType,string elementDetail);//通过某个元素细节找到元素,输出元素所有细节 size_t findElement(string elementDetailType,string elementDetail);//通过某个元素细节找到元素位置 static int inputAInt(int min = 0,int max = 9,int defaultValue = -1);//从键盘读取,限制为一个min到max间的整数,非法情况返回defaultValue void startControlLoop();//打开控制界面 ~SeqList();//析构函数

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

渡城WEDU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值