排序,敲代码的必经之路。同一串数字 不同代码 结果相同,其过程往往是解决问题的关键,时间复杂度,空间复杂度都是要考虑的问题。
巩固一下,做个小结。
## 一、直接插入排序
2 ,1 3 5 4
1 2 ,3 5 4
1 2 3 ,5 4
1 2 3 4 ,5
```cpp
/*
*从小到大之直接插入排序
*每次移动一个元素
*依次进行比对 插入到应在的位置
*/
#include<iostream>
using namespace std;
int main()
{
int a[]={2,1,3,5,4};
int i,j,temp;
//从第二个数开始比较
for(i=1;i<sizeof(a)/sizeof(a[0]);i++)
{
temp=a[i]; //记录当前需要插入元素的值
for(j=i-1;j>=0;j--) //从需要插入位的前一个位置 进行比较
{
if(temp<a[j]) //说明需要将元素移动到前面
{
a[j+1]=a[j]; // 移动元素
}
else //这个元素比前面的元素值要大 ,不需要移动
{
break;
}
}
a[j+1]=temp; //由于之前 j-- 了 所以在j+1位置插入元素
}
for(i=0;i<sizeof(a)/sizeof(a[0]);i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}
指针函数形式:
/*
*从小到大之直接插入排序
*每次移动一个元素
*依次进行比对 插入到应在的位置
*/
#include<iostream>
void sort(int *ptr,int n);
using namespace std;
int main()
{
int a[]={2,1,3,5,4};
int n=sizeof(a)/sizeof(a[0]);
sort(a,n);
for(int i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}
void sort(int *ptr,int n)
{
int i,j,temp;
//从第二个数开始比较
for(i=1;i<n;i++)
{
temp=*(ptr+i); //记录当前需要插入元素的值
for(j=i-1;j>=0;j--) //从需要插入位的前一个位置 进行比较
{
if(temp<*(ptr+j)) //说明需要将元素移动到前面
{
*(ptr+j+1)=*(ptr+j); // 移动元素
}
else //这个元素比前面的元素值要大 ,不需要移动
{
break;
}
}
*(ptr+j+1)=temp; //插入元素
}
二、冒泡排序
一个咕噜咕噜 在水底到水面是由小到大的过程 (冒泡的精髓)
/*
*从小到大之冒泡排序
*咕噜咕噜
*/
#include<iostream>
using namespace std;
int main()
{
int a[]={2,1,3,5,4};
int n=sizeof(a)/sizeof(a[0]);
//冒泡
for(int i=1;i<=n;i++)
{
for(int j=0;j<=n-i-1;j++)
{
if(a[j]>a[j+1])
{
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
for(int i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}
三、选择排序
/*
*从小到大之选择排序
*/
#include<iostream>
using namespace std;
int main()
{
int a[]={2,1,3,5,4};
int n=sizeof(a)/sizeof(a[0]);
int i,j,k,temp;
for(i=0;i<n;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(a[j]<a[k])
{
k=j;
}
}
if(k!=i)
{
temp=a[i];
a[i]=a[k];
a[k]=temp;
}
}
for(int i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}
四、希尔排序
规定步长 ,把步子上的数进行排序,从而达到整体上的排序
3 5 2 1 4
第一趟: 3 2 4 排序 2 3 4
5 1 排序 1 5
第一趟执行完 2 1 3 5 4
/*
*从小到大排序之希尔排序
*/
#include<iostream>
using namespace std;
int main()
{
int a[]={3,5,2,1,4};
int n=sizeof(a)/sizeof(a[0]);
int h,i,j,temp;
for(h=n/2;h>0;h/=2)
{
for(i=h;i<n;i++)
{
temp=a[i];
{
for(j=i-h;j>=0;j-=h)
{
if(temp<a[j])
{
a[j+h]=a[j];
}
else
{
break;
}
}
a[j+h]=temp;
}
}
}
for(i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}
五、归并排序
在这里插入代码片
1141

被折叠的 条评论
为什么被折叠?



