重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
1、冒泡排序(最常用)
成都创新互联服务项目包括永康网站建设、永康网站制作、永康网页制作以及永康网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,永康网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到永康省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
冒泡排序是最简单的排序方法:原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。(注意每一轮都是从a[0]开始比较的)
以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一轮一轮地比较,最后实现从小到大排序。
2、鸡尾酒排序
鸡尾酒排序又称双向冒泡排序、鸡尾酒搅拌排序、搅拌排序、涟漪排序、来回排序或快乐小时排序, 是冒泡排序的一种变形。该算法与冒泡排序的不同处在于排序时是以双向在序列中进行排序。
原理:数组中的数字本是无规律的排放,先找到最小的数字,把他放到第一位,然后找到最大的数字放到最后一位。然后再找到第二小的数字放到第二位,再找到第二大的数字放到倒数第二位。以此类推,直到完成排序。
3、选择排序
思路是设有10个元素a[1]-a[10],将a[1]与a[2]-a[10]比较,若a[1]比a[2]-a[10]都小,则不进行交换。若a[2]-a[10]中有一个以上比a[1]小,则将其中最大的一个与a[1]交换,此时a[1]就存放了10个数中最小的一个。同理,第二轮拿a[2]与a[3]-a[10]比较,a[2]存放a[2]-a[10]中最小的数,以此类推。
4、插入排序
插入排序是在一个已经有序的小序列的基础上,一次插入一个元素*
一般来说,插入排序都采用in-place在数组上实现。
具体算法描述如下:
⒈ 从第一个元素开始,该元素可以认为已经被排序
⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描
⒊ 如果该元素(已排序)大于新元素,将该元素移到下一位置
⒋ 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
⒌ 将新元素插入到下一位置中
⒍ 重复步骤2~5
如果是C语言的话只能手写堆排序、归并排序或者快速排序等等
如果是用C++的话可以看下面:
10W量级直接考虑使用STL的sort函数,用法自行百度或者参见
sort函数默认是升序排序,要降序排序可以传cmp函数过去或者sort完了reverse
1000W量级考虑使用计数排序或者基数排序,这两种排序对被排序数字的大小有一定限制
如果是1000W量级的实数排序,或者数字可能很大的话,那么还是回到之前说的sort
STL里提供了很多O(nlogn)级别的排序函数,比如sort、qsort、stable_sort
另外还有简化归并排序代码用的merge函数等等
以上所有函数均能在cplusplus.com查到详细用法
bool cmp(const int a,const int b)
{
if(a b)return false;
else return true;
}
templateclass T
void Swap(T t1,T t2)
{
T tmp;
tmp = t1,t1 = t2,t2=tmp;
}
void bubblesort(int arr[],int n)
{
int i,j;
bool flag = false;
if(NULL == arr || n = 0)return;
for(i = 0;i n - 1;i ++)
{
flag = false;
for(j = 0;j n - 1 - i;j ++)
{
if(cmp(arr[j],arr[j+1]))
{
Swap(arr[j],arr[j+1]);
flag = true;
}
}
if(!flag)
{
break;
}
}
}
void insertsort(int arr[],int n)
{
int i,j;
int insert;
if(arr == NULL || n = 0)return;
for(i = 1;i = n;i ++)
{
insert = arr[i];
arr[0] = arr[i];
for(j = i;cmp(arr[j-1],insert);j --)
{
arr[j] = arr[j-1];
}
arr[j] = insert;
}
}
void selectsort(int arr[],int n)
{
int i,j;
for(i = 0;i n;i ++)
{
int maxindex = 0;
for(j = 0;j n - i;j ++)
{
if(arr[maxindex] arr[j])
{
maxindex = j;
}
}
Swap(arr[maxindex],arr[n-1-i]);
}
}
int partition(int arr[],int s,int e)
{
int pov = arr[s];
if(arr == NULL || s e)return -1;
else
{
while(s e)
{
while(s e cmp(arr[e],pov)) e--;
arr[s] = arr[e];
while(s e cmp(pov,arr[s])) s++;
arr[e] = arr[s];
}
arr[s] = pov;
return s;
}
}
void Qsort(int arr[],int s,int e)
{
if(arr == NULL || s e)return;
int pov = partition(arr,s,e);
Qsort(arr,s,pov - 1);
Qsort(arr,pov + 1,e);
}
int main()
{
int arr[] = {-1,9,5,1,2,3,4,8,77,6,88,100,-8,11,12,13,10,89,5689,-9,777,999};
typedef int sizet;
sizet size = 21;
int algorithm = 3;
switch(algorithm)
{
case 0:
bubblesort(arr,size);
break;
case 1:
insertsort(arr,size);
break;
case 2:
selectsort(arr,size+1);
break;
case 3:
Qsort(arr,0,size);
break;
}
for(int i = 0;i = size;i ++)
if(i size)cout arr[i] " , ";
else cout arr[i] endl;
return 0;
}
根据修改cmp函数可以实现升序和降序
#includestdio.h
#includestdlib.h
#define N 100
int cmp(const void*a,const void*b)
{//快速排序比较函数
int *x=(int*)a;
int *y=(int*)b;
return *y-*x;
}
int main()
{
int a[N]={9,7,5,3,1};
int b[N]={8,6,4,2,0};
int sum[2*N]={0};//合并数组
int k=0;//合并数组元素个数的计数
for(int i=0;i5;i++)
{
sum[k++]=a[i];//a数组元素赋值给sum数组
}
for(int i=0;i5;i++)
{
sum[k++]=b[i];//b数组元素赋值给sum数组
}
qsort(sum,10,sizeof(sum[0]),cmp);//降序排序
for(int i=0;ik;i++)//输出
printf("%d ",sum[i]);
return 0;
}
bool Cmp(int a, int b, int flag) {
if(flag) return a b;
return a b;
}
void Swap(int a, int b) {
int tmp = a;
a = b;
b = tmp;
}
void BubbleSort(int a[], int left, int right, int flag) {//flag为1时表示升序排序,为0时表示降序排序
int i, j, tmp;
bool exchanged;
for(i = left; i right; i++) {
exchanged = false;
for(j = right; j i; j--)
if(Cmp(a[j], a[j + 1], flag))
Swap(a[j], a[j + 1]);
exchanged = true;
}
if(exchanged == false) break;
}
}
void main( ) {
int n, a[100];
cin n;
for(int i = 0; i n; i++)
cin a[i];
BubbleSort(a, 0, n / 2 - 1, 1); //前半部分升序排序
BubbleSort(a, n / 2 + n % 2, n - 1, 0); //后半部分降序排序
for(i = 0; i n; i++)
cout a[i] " ";
}
“我想要的是更好的算法!”你的“更好”指的是什么意思?性能更好?可读性更好?还是更容易实现?对于性能更好,你的题目里已经限定了条件,“用起泡法对数组a...... ”,所以,对性能更好,你问的问题是前后冲突,你得修改问题了。对于可读性,这就看程序是否容易理解。