(1)冒泡排序
void BubbleSort(int a[], int n, int order) {
//冒泡排序(a表示数组,n表示数组大小,order为0时从小到大排序,order为1时,从大到小排序)
int i, j, temp;
for (i = 0; i < n - 1; i++) {
for (j = i; j < n; j++) {
if (order == 0) {//从小到大
if (a[i] > a[j]) {
temp = a[j];
a[j] = a[i];
a[i] = temp;
}
}
if (order == 1) {//从大到小
if (a[i] < a[j]) {
temp = a[j];
a[j] = a[i];
a[i] = temp;
}
}
}
}
}
(2)直接插入排序
void InsertSort(int a[], int n, int order) {
//直接插入排序(a表示数组,n表示数组大小,order为0时从小到大排序,order为1时,从大到小排序)
int i, j;
int temp;
if (order == 0) {
for (i = 0; i < n - 1; i++) {
temp = a[i + 1];
j = i;
while (j > -1 && (temp < a[j])) {
a[j + 1] = a[j];
j--;
}
a[j + 1] = temp;
}
}
if (order == 1) {
for (i = 0; i < n - 1; i++) {
temp = a[i + 1];
j = i;
while (j > -1 && temp > a[j]) {
a[j + 1] = a[j];
j--;
}
a[j + 1] = temp;
}
}
}
(3)希尔排序
void ShellSort(int a[], int n, int order) { //希尔排序
//希尔排序(a表示数组,n表示数组大小,order为0时从小到大排序,order为1时,从大到小排序)
int span = n, i, j, k, temp = 0, l = 0;//span为循环排序的增量
while (span = span / 2) {
for (k = 0; k < span; k++) {
for (i = k; i < n - span; i = i + span) {
temp = a[i + span];
j = i;
if (order == 0) {
while (j > -1 && temp < a[j]) {
a[i + span] = a[j];
j = j - span;
}
}
if (order == 1) {
while (j > -1 && temp > a[j]) {
a[i + span] = a[j];
j = j - span;
}
}
a[j + span] = temp;
}
}
}
}
(4)直接选择排序
void SelectSort(int a[], int n, int order) { //直接选择排序
//直接选择排序(a表示数组,n表示数组大小,order为0时从小到大排序,order为1时,从大到小排序)
int i, j, max;
int temp;
for (i = 0; i < n - 1; i++) {
max = i;
for (j = i + 1; j < n; j++) {
if (order == 0) {
if (a[j] < a[max])
max = j;
}
if (order == 1) {
if (a[j] > a[max])
max = j;
}
}
if (max != i) {
temp = a[i];
a[i] = a[max];
a[max] = temp;
}
}
}
(5)堆排序
void CreatHeap(int a[], int n, int h) {//调整非叶结点a[h]使之满足最大堆,n为数组a的元素个数
int i, j, flag;
int temp;
i = h; //i为要建堆的二叉树根结点下标
j = 2 * i + 1; //j为i的左孩子结点下标
temp = a[i];
flag = 0;
//沿左右孩子中值较大者重复向下筛选
while (j < n && flag != 1) {
//寻找左右孩子结点中的较大者,j为其下标
if (j < n - 1 && a[j] < a[j + 1])
j++;
if (temp > a[j])
flag = 1; //标记结束筛选条件
else { //否则把a[j]上移
a[i] = a[j];
i = j;
j = 2 * i + 1;
}
}
a[i] = temp; //把最初的a[i]赋予最后的a[j]
}
void InitCreatHeap(int a[], int n) {
//初始化为最大堆
int i;
for (i = (n - 2) / 2; i >= 0; i--)
CreatHeap(a, n, i);
}
void HeapSort(int a[], int n, int order) {
//堆排序(a表示数组,n表示数组大小,order为0时从小到大排序,order为1时,从大到小排序)
int i;
int temp;
InitCreatHeap(a, n); //初始化为最大堆
if (order == 0) { //当前最大堆个数每次递减1
for (i = n - 1; i > 0; i--) {
temp = a[0];
a[0] = a[i];
a[i] = temp;
CreatHeap(a, i, 0); //调整根结点满足最大堆
}//注意:此时子二叉树根结点下标为0,子二叉树结点数为1
}
if (order == 1);
}
2022/5/22
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)