#include <iostream>
#include <vector>
using namespace std;
//直接插入排序C
/*void insertsort(list r,int n)
{
int i,j;
for(i=2;i<n;++i)
{
r[0]=r[i];
j=i-1;
while(r[0].key<r[j].key)
{
r[j+1]=r[j];
j--;
}
r[j+1]=r[0];
}
}*/
//C++
int zhicha()
{
vector<int> shuju;
int a;
cout<<"请输入排序数据(以空格分隔数据 按Ctrl+Z结束输入)"<<endl;
shuju.push_back(0);
while(cin>>a)
shuju.push_back(a);
vector<int>::size_type size=shuju.size();
size-=1;
vector<int>::size_type i,j;
for(i=2;i<=size;++i)
{
shuju[0]=shuju[i];
j=i-1;
while(shuju[0]<shuju[j])
{
shuju[j+1]=shuju[j];
j--;
}
shuju[j+1]=shuju[0];
}
vector<int>::iterator first=shuju.begin()+1;
while(first!=shuju.end())
cout<<*(first++)<<" " ;
cout<<endl;
return 0;
}
//二分法插入排序
/* {
int left,right,num,middle,j;
for( int i = 1;i < data1.Length;i++)
{ // 准备
left = 0;right = i-1;
num = data1[i];
// 二分法查找插入位置
while( right >= left)
{
// 指向已排序好的中间位置
middle = ( left + right ) / 2;
if( num < data1[middle] )
// 插入的元素在右区间
right = middle-1;
else
// 插入的元素在左区间
left = middle+1;
}
// 后移排序码大于R[i]的记录
for( j = i-1;j >= left;j-- )
{
data1[j+1] = data1[j];
}
// 插入
data1[left] = num;
}
*/
int erfencharu()
{
vector<int> shuju;
int a,left,right,num,middle,j;
cout<<"请输入排序数据(以空格分隔数据 按Ctrl+Z结束输入)"<<endl;
while(cin>>a)
shuju.push_back(a);
vector<int>::size_type size=shuju.size(),i;
for( i=1;i<size;++i)
{
left=0;
right=i-1;
num=shuju[i];
while(right>=left)
{
middle=(left+right)/2;
if(num<shuju[middle])
right=middle-1;
else
left=middle+1;
}
for(j=i-1;j>=left;--j)
{
shuju[j+1]=shuju[j];
}
shuju[left]=num;
}
//vector<int>::iterator first=shuju.begin();
//while(first!=shuju.end())
//cout<<*(first++)<<" " ;
i=0;
while(i<size)
cout<<shuju[i++]<<" ";
cout<<endl;
return 0;
}
//希尔排序 不稳定排序
/*
void shellsort1(int a[], int n)
{
int i, j, gap;
for (gap = n / 2; gap > 0; gap /= 2) //步长
for (i = 0; i < gap; i++) //直接插入排序
{
for (j = i + gap; j < n; j += gap)
if (a[j] < a[j - gap])
{
int temp = a[j];
int k = j - gap;
while (k >= 0 && a[k] > temp)
{
a[k + gap] = a[k];
k -= gap;
}
a[k + gap] = temp;
}
}
}
很明显,上面的shellsort1代码虽然对直观的理解希尔排序有帮助,但代码量太大了,不够简洁清晰。因此进行下改进和优化,以第二次排序为例,原来是每次从1A到1E,从2A到2E,可以改成从1B开始,先和1A比较,然后取2B与2A比较,再取1C与前面自己组内的数据比较…….。这种每次从数组第gap个元素开始,每个元素与自己组内的数据进行直接插入排序显然也是正确的
//
void shellsort2(int a[], int n)
{
int j, gap;
for (gap = n / 2; gap > 0; gap /= 2)
for (j = gap; j < n; j++)//从数组第gap个元素开始
if (a[j] < a[j - gap])//每个元素与自己组内的数据进行直接插入排序
{
int temp = a[j];
int k = j - gap;
while (k >= 0 && a[k] > temp)
{
a[k + gap] = a[k];
k -= gap;
}
a[k + gap] = temp;
}
}
void shellsort3(int a[], int n)
{
int i, j, gap;
for (gap = n / 2; gap > 0; gap /= 2)
for (i = gap; i < n; i++)
for (j = i - gap; j >= 0 && a[j] > a[j + gap]; j -= gap)
Swap(a[j], a[j + gap]);
}
*/
//冒泡排序
int maopao()
{
vector<int> shuju;
int a,j,temp;
cout<<"请输入排序数据(以空格分隔数据 按Ctrl+Z结束输入)"<<endl;
while(cin>>a)
shuju.push_back(a);
vector<int>::size_type size=shuju.size(),i;
for(j=0;j<size-1;++j)
for(i=0;i<size-1-j;++i)
{
if(shuju[i]>shuju[i+1])
{
temp=shuju[i];
shuju[i]=shuju[i+1];
shuju[i+1]=temp;
}
}
i=0;
while(i<size)
cout<<shuju[i++]<<" ";
cout<<endl;
return 0;
}
//快速排序 不稳定
/*
//快速排序
void quick_sort(int s[], int l, int r)
{
if (l < r)
{
//Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换 参见注1
int i = l, j = r, x = s[l];
while (i < j)
{
while(i < j && s[j] >= x) // 从右向左找第一个小于x的数
j--;
if(i < j)
s[i++] = s[j];
while(i < j && s[i] < x) // 从左向右找第一个大于等于x的数
i++;
if(i < j)
s[j--] = s[i];
}
s[i] = x;
quick_sort(s, l, i - 1); // 递归调用
quick_sort(s, i + 1, r);
}
}
int AdjustArray(int s[], int l, int r) //返回调整后基准数的位置
{
int i = l, j = r;
int x = s[l]; //s[l]即s[i]就是第一个坑
while (i < j)
{
// 从右向左找小于x的数来填s[i]
while(i < j && s[j] >= x)
j--;
if(i < j)
{
s[i] = s[j]; //将s[j]填到s[i]中,s[j]就形成了一个新的坑
i++;
}
// 从左向右找大于或等于x的数来填s[j]
while(i < j && s[i] < x)
i++;
if(i < j)
{
s[j] = s[i]; //将s[i]填到s[j]中,s[i]就形成了一个新的坑
j--;
}
}
//退出时,i等于j。将x填到这个坑中。
s[i] = x;
return i;
}
void quick_sort1(int s[], int l, int r)
{
if (l < r)
{
int i = AdjustArray(s, l, r);//先成挖坑填数法调整s[]
quick_sort1(s, l, i - 1); // 递归调用
quick_sort1(s, i + 1, r);
}
}
*/
//直接选择排序 不稳定
//树形选择排序
//堆排序 不稳定
//并归排序
int main()
{
//zhicha();//直插排序
//erfencharu();//二分插入排序
maopao();//冒泡排序
system("pause");
return 0;
}
/*
/二叉树链式存储的实现
#include<iostream>
#include<cstring>
using namespace std;
struct ECS_data //先定义好一个数据的结构
{
char data;
ECS_data *l;
ECS_data *r;
};
class ECS
{
private:
//int level; //树高
int n; //表示有多少个节点数
int n1; //表示的是数组的总长度值,(包括#),因为后面要进行删除判断
ECS_data *temp[1000];
public:
ECS_data *root;
ECS() //初始化
{
ECS_data *p;
char t[1000];int i;
int front=0,rear=1; //front表示有多少个节点,rear表示当前插入的点的父母
cout<<"请按正确顺序输入二叉树的数据:";
cin.getline(t,1000); //先把输入的数据输入到一个t数组
//cout<<t<<" "<<endl;
int n1=strlen(t); //测量数据的长度
n=0;
for(i=0;i<n1;i++)
{
if(t[i]!='#')
{
p=NULL;
if(t[i]!=',') //满足条件并开辟内存
{
n++;
p=new ECS_data;
p->data=t[i];
p->l=NULL;
p->r=NULL;
}
front++;
temp[front]=p;
if(1 == front){root=p;}
else
{
if((p!=NULL)&&(0==front%2))
{
temp[rear]->l=p;//刚开始把这里写成了==
}
if((p!=NULL)&&(1==front%2))
{
temp[rear]->r=p;
}
if(1==front%2)rear++; //就当前的数据找这个数据的父母
}
}
}
}
~ECS() //释放内存
{
int i;
for(i=1;i<=n;i++)
if(temp[i]!=NULL)
delete temp[i];
}
void JS() //记录节点的个数
{
int s;
s=n;
cout<<"该二叉树的节点数为:"<<s<<endl;
}
void BL1(ECS_data *t)//先序遍历
{
if(NULL!=t)
{
cout<<t->data<<",";
BL1(t->l);
BL1(t->r);
}
}
void BL2(ECS_data *t)//中序遍历
{
if(NULL!=t)
{
BL2(t->l);
cout<<t->data<<",";
BL2(t->r);
}
}
void BL3(ECS_data *t)//后续遍历
{
if(NULL!=t)
{
BL3(t->l);
BL3(t->r);
cout<<t->data<<",";
}
}
};
int main()
{
ECS a;
a.JS();
a.BL1(a.root);
cout<<endl;
a.BL2(a.root);
cout<<endl;
a.BL3(a.root);
cout<<endl;
return 0;
}
*/
笔记二 排序
最新推荐文章于 2020-08-19 19:08:36 发布