好久没更CSDN了,个人博客同步更新,欢迎大家来看
8638 直接插入排序
Description
用函数实现直接插入排序,并输出每趟排序的结果.
输入格式
第一行:键盘输入待排序关键的个数n
第二行:输入n个待排序关键字,用空格分隔数据
输出格式
每行输出一趟排序结果,数据之间用一个空格分隔
输入样例
10
5 4 8 0 9 3 2 6 7 1
输出样例
4 5 8 0 9 3 2 6 7 1
4 5 8 0 9 3 2 6 7 1
0 4 5 8 9 3 2 6 7 1
0 4 5 8 9 3 2 6 7 1
0 3 4 5 8 9 2 6 7 1
0 2 3 4 5 8 9 6 7 1
0 2 3 4 5 6 8 9 7 1
0 2 3 4 5 6 7 8 9 1
0 1 2 3 4 5 6 7 8 9
代码实现
#include <iostream>
using namespace std;
void Insort(int *sq, int len) {
for (int i = 2; i <= len; ++i) {
if (sq[i] < sq[i - 1]) {
sq[0] = sq[i];//哨岗
sq[i] = sq[i - 1];//移位
int j;
for (j = i - 1; sq[j - 1] > sq[0]; j--)
sq[j] = sq[j - 1];//移位,找位置,直到要插入的位置的前一个元素<=要插入的元素(等于的话一般为碰到哨岗,所以插在第一位)
sq[j] = sq[0];//插入
}
for (int k = 1; k <= len; ++k)
cout << sq[k] << " ";
cout << endl;
}
}
int main() {
int cas;
int sq[100000];
cin >> cas;
for (int i = 1; i <= cas; ++i)
cin >> sq[i];
Insort(sq, cas);
}
8639 折半插入排序
Description
用函数实现折半插入排序,并输出每趟排序的结果.
输入格式
第一行:键盘输入待排序关键的个数n
第二行:输入n个待排序关键字,用空格分隔数据
输出格式
每行输出一趟排序结果,数据之间用一个空格分隔
输入样例
10
5 4 8 0 9 3 2 6 7 1
输出样例
4 5 8 0 9 3 2 6 7 1
4 5 8 0 9 3 2 6 7 1
0 4 5 8 9 3 2 6 7 1
0 4 5 8 9 3 2 6 7 1
0 3 4 5 8 9 2 6 7 1
0 2 3 4 5 8 9 6 7 1
0 2 3 4 5 6 8 9 7 1
0 2 3 4 5 6 7 8 9 1
0 1 2 3 4 5 6 7 8 9
代码实现
#include <iostream>
using namespace std;
void BInsort(int *sq, int len) {
for (int i = 2; i <= len; ++i) {
sq[0] = sq[i];
int s = 1, e = i - 1;//查找区间
//折半查找可插入的位置
while (s <= e) {
int m = (s + e) / 2;
if (sq[0] < sq[m])e = m - 1;
else s = m + 1;
}
//此时m为要插入的位置
//将插入位置m=e+1后的元素统一后移,
for (int j = i; j > e + 1; j--)sq[j] = sq[j - 1];
sq[e + 1] = sq[0];//插入
for (int k = 1; k <= len; ++k)
cout << sq[k] << " ";
cout << endl;
}
}
int main() {
int cas;
int sq[100000];
cin >> cas;
for (int i = 1; i <= cas; ++i)
cin >> sq[i];
BInsort(sq, cas);
}
8640 希尔(shell)排序
Description
用函数实现希尔(shell)排序,并输出每趟排序的结果,初始增量d=n/2,其后d=d/2
输入格式
第一行:键盘输入待排序关键的个数n
第二行:输入n个待排序关键字,用空格分隔数据
输出格式
每行输出一趟排序结果,数据之间用一个空格分隔
输入样例
10
5 4 8 0 9 3 2 6 7 1
输出样例
3 2 6 0 1 5 4 8 7 9
1 0 3 2 4 5 6 8 7 9
0 1 2 3 4 5 6 7 8 9
代码实现
#include<iostream>
#include<vector>
using namespace std;
void shellSort(int a[], int len) {
int tmp;
int d = len / 2;
while (d) {
for (int i = d; i < len; i++) //分组,遍历每个组
{
tmp = a[i];
int j = i;
//组内向前查询可插入的位置
while (j >= d && tmp < a[j - d]) {
a[j] = a[j - d];//记录后移
j -= d;//前一个组内元素
}
a[j] = tmp;//插入
}
d = d / 2;
for (int i=0;i<len;i++) {
printf("%d ",a[i]);
}
cout<<endl;
}
}
int main() {
int n;
cin>>n;
int L[n];
for(int i=0;i<n;i++){
scanf("%d",&L[i]);
}
shellSort(L, n);
return 0;
}
8641 冒泡排序
Description
用函数实现冒泡排序,并输出每趟排序的结果(要求当一趟冒泡过程中不再有数据交换,则排序结束)
输入格式
第一行:键盘输入待排序关键的个数n
第二行:输入n个待排序关键字,用空格分隔数据
输出格式
每行输出每趟排序结果,数据之间用一个空格分隔
输入样例
10
5 4 8 0 9 3 2 6 7 1
输出样例
4 5 0 8 3 2 6 7 1 9
4 0 5 3 2 6 7 1 8 9
0 4 3 2 5 6 1 7 8 9
0 3 2 4 5 1 6 7 8 9
0 2 3 4 1 5 6 7 8 9
0 2 3 1 4 5 6 7 8 9
0 2 1 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
代码实现
#include <iostream>
using namespace std;
void Bubblesort(int *sq, int len) {
int end = len - 1;//未排序的结束位置
bool flag;//是否发生交换
while (end > 0 && flag){
flag= false;
for (int i = 1; i <= end; ++i) {
if(sq[i]>sq[i+1]){
int tmp=sq[i];
sq[i]=sq[i+1];
sq[i+1]=tmp;
flag= true;//发生交换
}
}
end--;
for (int k = 1; k <= len; ++k)
cout << sq[k] << " ";
cout << endl;
}
}
int main() {
int cas;
int sq[100000];
cin >> cas;
for (int i = 1; i <= cas; ++i)
cin >> sq[i];
Bubblesort(sq, cas);
}
8642 快速排序
Description
用函数实现快速排序,并输出每次分区后排序的结果
输入格式
第一行:键盘输入待排序关键的个数n
第二行:输入n个待排序关键字,用空格分隔数据
输出格式
每行输出每趟排序的结果,数据之间用一个空格分隔
输入样例
10
5 4 8 0 9 3 2 6 7 1
输出样例
1 4 2 0 3 5 9 6 7 8
0 1 2 4 3 5 9 6 7 8
0 1 2 4 3 5 9 6 7 8
0 1 2 3 4 5 9 6 7 8
0 1 2 3 4 5 8 6 7 9
0 1 2 3 4 5 7 6 8 9
0 1 2 3 4 5 6 7 8 9
代码实现
#include <iostream>
using namespace std;
int Part(int *sq, int l, int r) {
sq[0] = sq[l];
int piv = sq[l];
while (l < r) {
while (sq[r] >= piv && l < r)r--;//从右往左找到第一个小于枢轴的
sq[l] = sq[r];
while (sq[l] <= piv && l < r)l++;//左往右找大的
sq[r] = sq[l];
}
sq[l] = sq[0];
return l;//返回枢轴
}
void Qsort(int *sq, int l, int r,int len) {
if (l < r) {
int pivLoc = Part(sq, l, r);
for (int k = 1; k <= len; ++k)//这里的len只用于打印,可删除
cout << sq[k] << " ";
cout << endl;
Qsort(sq, l, pivLoc - 1,len);
Qsort(sq, pivLoc + 1, r,len);
}
}
int main() {
int cas;
int sq[100000];
cin >> cas;
for (int i = 1; i <= cas; ++i)
cin >> sq[i];
Qsort(sq,1, cas,cas);
}
8643 简单选择排序
Description
用函数实现简单选择排序,并输出每趟排序的结果
输入格式
第一行:键盘输入待排序关键的个数n
第二行:输入n个待排序关键字,用空格分隔数据
输出格式
每行输出每趟排序的结果,数据之间用一个空格分隔
输入样例
10
5 4 8 0 9 3 2 6 7 1
输出样例
0 4 8 5 9 3 2 6 7 1
0 1 8 5 9 3 2 6 7 4
0 1 2 5 9 3 8 6 7 4
0 1 2 3 9 5 8 6 7 4
0 1 2 3 4 5 8 6 7 9
0 1 2 3 4 5 8 6 7 9
0 1 2 3 4 5 6 8 7 9
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
代码实现
#include <iostream>
using namespace std;
void Ssort(int *sq, int len) {
for (int i = 1; i < len; ++i) {
int k = i;
for (int j = i + 1; j <= len; ++j)//找到后面最小的
if (sq[j] < sq[k])k = j;
//if (k == i)continue;//如果没有,下一个,题目不需要跳过
int tmp = sq[k];
sq[k] = sq[i];
sq[i] = tmp;
for (int k = 1; k <= len; ++k)
cout << sq[k] << " ";
cout << endl;
}
}
int main() {
int cas;
int sq[100000];
cin >> cas;
for (int i = 1; i <= cas; ++i)
cin >> sq[i];
Ssort(sq, cas);
}
8644 堆排序
Description
用函数实现堆排序,并输出每趟排序的结果
输入格式
第一行:键盘输入待排序关键的个数n
第二行:输入n个待排序关键字,用空格分隔数据
输出格式
第一行:初始建堆后的结果
其后各行输出交换堆顶元素并调整堆的结果,数据之间用一个空格分隔
输入样例
10
5 4 8 0 9 3 2 6 7 1
输出样例
9 7 8 6 4 3 2 5 0 1
8 7 3 6 4 1 2 5 0 9
7 6 3 5 4 1 2 0 8 9
6 5 3 0 4 1 2 7 8 9
5 4 3 0 2 1 6 7 8 9
4 2 3 0 1 5 6 7 8 9
3 2 1 0 4 5 6 7 8 9
2 0 1 3 4 5 6 7 8 9
1 0 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
代码实现
#include <iostream>
using namespace std;
//假设r[s+1..m]已经是堆,将r[s..len]调整为以r[s]为根的大根堆
void Adjust(int *sq, int s, int len) {
int rc = sq[s];//最初根节点
int left = 2 * s;
for (int i = left; i <= len; i *= 2) {
if (sq[i] < sq[i + 1] && i < len)i++;//取左右节点较大那个
if (rc < sq[i]) {//筛
sq[s] = sq[i];//向前换
s = i;//指针跟进
}
}
sq[s] = rc;//这个替换是个循环
}
void CreatHeap(int *sq, int len) {
for (int i = len / 2; i > 0; --i)//从下往上,逐个树生成大顶堆
Adjust(sq, i, len);
}
void StackSort(int *sq, int len) {
CreatHeap(sq, len);
//从最后一个节点开始往前换
for (int i = len; i > 1; --i) {
for (int k = 1; k <= len; ++k)
cout << sq[k] << " ";
cout << endl;
int tmp = sq[1];
sq[1] = sq[i];
sq[i] = tmp;
Adjust(sq, 1, i - 1);//每次换后调整为大顶堆
}
}
int main() {
int cas;
int sq[100000];
cin >> cas;
for (int i = 1; i <= cas; ++i)
cin >> sq[i];
StackSort(sq, cas);
for (int k = 1; k <= cas; ++k)
cout << sq[k] << " ";
cout << endl;
}
8645 归并排序(非递归算法)
Description
用函数实现归并排序(非递归算法),并输出每趟排序的结果
输入格式
第一行:键盘输入待排序关键的个数n
第二行:输入n个待排序关键字,用空格分隔数据
输出格式
每行输出每趟排序的结果,数据之间用一个空格分隔
输入样例
10
5 4 8 0 9 3 2 6 7 1
输出样例
4 5 0 8 3 9 2 6 1 7
0 4 5 8 2 3 6 9 1 7
0 2 3 4 5 6 8 9 1 7
0 1 2 3 4 5 6 7 8 9
代码实现
#include <iostream>
using namespace std;
int len;
void Merge(int x[], int l, int m, int r) {
int *tmp = new int[r - l + 10];//暂存
int i = l, j = m + 1, k = 0;//i为左半部分索引,j为右半部分,k为y中索引
while (i <= m && j <= r) {
if (x[i] >= x[j])tmp[k++] = x[j++];
else tmp[k++] = x[i++];
}
//剩余部分
while (i <= m)tmp[k++] = x[i++];
while (j <= r)tmp[k++] = x[j++];
//返回
for (i = l, k = 0; i <= r; i++, k++) {
x[i] = tmp[k];
}
delete[]tmp;//释放内存,由于指向的是数组,必须用delete []
}
//两组两组归并
void group_two(int x[], int gap) {
int i = 1;
//是否还能划出两组
while (i + 2 * gap - 1 < len) {
Merge(x, i, i + gap - 1, i + 2 * gap - 1);
i += 2 * gap;
}
//划不出两组但能划出一组
if (i + gap - 1 < len) Merge(x, i, i + gap - 1, len);
//一组也画不出则不管
}
void Msort(int x[])//确定每一次合并的跨度span
{
for (int gap = 1; gap < len; gap *= 2)//再大就不用分了
{
group_two(x, gap);
for (int k = 1; k <= len; ++k)
cout << x[k] << " ";
cout << endl;
}
}
int main() {
int sq[100000];
cin >> len;
for (int i = 1; i <= len; ++i)
cin >> sq[i];
Msort(sq);
}
8646 基数排序
Description
用函数实现基数排序,并输出每次分配收集后排序的结果
输入格式
第一行:键盘输入待排序关键的个数n
第二行:输入n个待排序关键字,用空格分隔数据
输出格式
每行输出每趟每次分配收集后排序的结果,数据之间用一个空格分隔
输入样例
10
278 109 063 930 589 184 505 069 008 083
输出样例
930 063 083 184 505 278 008 109 589 069
505 008 109 930 063 069 278 083 184 589
008 063 069 083 109 184 278 505 589 930
代码实现
#include <iostream>
#include <string>
#include <queue>
using namespace std;
#define RADIX 10//基数
int len;//记录数
string sq[1000];//用string方便取一个整数的某一位,此处偷懒了,没有按题目要求用链式,而使用的顺序结构。
queue<string> Bucket[RADIX];//子表,也就是桶排序中的桶
void RDsort() {
int recLen = sq[1].length();//记录的长度,也就是位数
//逐个取关键字,即某个位数,从右往左,直到第一个下标为0
for (int i = recLen - 1; i >= 0; --i) {
//遍历主表每个记录,分配入桶,主表下标从1开始
for (int j = 1; j <= len; ++j)
Bucket[sq[j][i] - 48].push(sq[j]);//字符转整数,供下标使用
int newLoc = 1;//新主表的下标,表示刚出桶的元素应该插入到哪个位置
//遍历每个桶,合并出桶,下标从0开始
for (int j = 0; j < RADIX; ++j) {
//清空该桶
while (!Bucket[j].empty()) {
sq[newLoc++] = Bucket[j].front();//插入回新主表
Bucket[j].pop();
}
}
for (int k = 1; k <= len; ++k)
cout << sq[k] << " ";
cout << endl;
}
}
int main() {
cin >> len;//记录数
for (int i = 1; i <= len; ++i)
cin >> sq[i];
RDsort();
}