今天课上所听的9种排序!
来源:互联网 发布:理肤泉b5真假知乎 编辑:程序博客网 时间:2024/06/05 19:22
#include <stdio.h>
//交换函数
void swap(int a[],int i,int j)
{
int tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
//打印函数
void printA(int *a,int len)
{
int i;
for(i=0;i<len;i++)
{
printf("%4d",a[i]);
}
printf("\n");
}
//冒泡排序
int main1()
{
int a[10]={2,4,6,1,7,9,3,8,0,5};
int len=sizeof(a)/sizeof(a[0]);
int i,j;
for(i=0;i<len-1;i++)
{
for(j=0;j<len-i-1;j++)
{
if(a[j]>a[j+1])
{
swap(a,j,j+1);
}
}
}
printA(a,len);
return 0;
}
//鸡尾酒排序
int main2()
{
int a[10]={2,4,6,1,7,9,3,8,0,5};
int len=sizeof(a)/sizeof(a[0]);
int i;
int left=0;
int right=len-1;
while(left<right)
{
for(i=left;i<right;i++)
{
if(a[i]>a[i+1])
{
swap(a,i,i+1);
}
}
right--;
for(i=right;i>left;i--)
{
if(a[i-1]>a[i])
{
swap(a,i,i-1);
}
}
left++;
}
printA(a,len);
return 0;
}
//选择排序
int main3()
{
int a[10]={2,4,6,1,7,9,3,8,0,5};
int len=sizeof(a)/sizeof(a[0]);
int i,j;
int min;//保存最小数的下标
for(i=0;i<len-1;i++)
{
min=i;
for(j=i+1;j<len;j++)
{
if(a[min]>a[j])
{
min=j;
}
}
if(min!=i)
{
swap(a,i,min);
}
}
printA(a,len);
return 0;
}
//插入排序
int main4()
{
int a[10]={2,4,6,1,7,9,3,8,0,5};
int len=sizeof(a)/sizeof(a[0]);
int get;
int i,j;
for(i=1;i<len;i++)
{
get=a[i]; //抓牌
j=i-1;
while(j>=0&&a[j]>get)
{
a[j+1]=a[j];
j--;
}
a[j+1]=get;
}
printA(a,len);
return 0;
}
//二分插入排序
int main5()
{
int a[10]={2,4,6,1,7,9,3,8,0,5};
int len=sizeof(a)/sizeof(a[0]);
int left,right,mid,i,j,get;
for(i=1;i<len;i++)
{
get=a[i];
left=0;
right=i-1;
while(left<=right)
{
mid=(left+right)/2;
if(a[mid]>get)
{
right=mid-1;
}
else
{
left=mid+1;
}
}
for(j=i-1;j>=left;j--)
{
a[j+1]=a[j];
}
a[left]=get;
}
printA(a,len);
return 0;
}
//希尔排序
int main6()
{
int a[10]={2,4,6,1,7,9,3,8,0,5};
int len=sizeof(a)/sizeof(a[0]);
int i,j,get;
int d=len;
do
{
d=d/3+1;
for(i=d;i<len;i++)
{
get=a[i];
j=i-d;
while(j>=0&&a[j]>get)
{
a[j+d]=a[j];
j-=d;
}
a[j+d]=get;
}
}while(d>1);
printA(a,len);
return 0;
}
//堆排序
void heapify(int *a,int i,int len)
{
int left=2*i+1;
int right=2*i+2;
int max=i;
if(left<len&&a[left]>a[max])
max=left;
if(right<len&&a[right]>a[max])
max=right;
if(max!=i)
{
swap(a,i,max);
heapify(a,max,len);
}
}
void heapsort(int *a,int len)
{
//建堆
int i;
for(i=len/2-1;i>=0;i--)
{
heapify(a,i,len);
}
//排序
for(i=len-1;i>0;i--)
{
swap(a,0,i);
len--;
heapify(a,0,len);
}
}
int main7()
{
int a[10]={2,4,6,1,7,9,3,8,0,5};
int len=sizeof(a)/sizeof(a[0]);
heapsort(a,len);
printA(a,len);
return 0;
}
//归并排序
void merge(int *a,int left,int mid,int right,int *tmp)
{
int i=left;
int j=mid+1;
int k=0;
while(i<=mid&&j<=right)
{
if(a[i]>a[j])
tmp[k++]=a[j++];
else
tmp[k++]=a[i++];
}
while(i<=mid)
tmp[k++]=a[i++];
while(j<=right)
tmp[k++]=a[j++];
k=0;
for(i=left;i<=right;i++)
{
a[i]=tmp[k++];
}
}
void mergesort(int *a,int left,int right,int *tmp)
{
if(left>=right)
return;
int mid=(left+right)/2;
mergesort(a,left,mid,tmp);
mergesort(a,mid+1,right,tmp);
merge(a,left,mid,right,tmp);
}
int main8()
{
int a[10]={2,4,6,1,7,9,3,8,0,5};
int len=sizeof(a)/sizeof(a[0]);
int tmp[10];
mergesort(a,0,len-1,tmp);
printA(a,len);
return 0;
}
//快速排序
int partition(int *a,int left,int right)
{
int pivot=a[right];
int index=left;
int i;
for(i=left;i<right;i++)
{
if(a[i]<pivot)
{
swap(a,i,index);
index++;
}
}
swap(a,index,right);
return index;
}
void qsort(int *a,int left,int right)
{
if(left<right)
{
int pivot=partition(a,left,right);
qsort(a,left,pivot-1);
qsort(a,pivot+1,right);
}
}
int main9()
{
int a[10]={2,4,6,1,7,9,3,8,0,5};
int len=sizeof(a)/sizeof(a[0]);
qsort(a,0,len-1);
printA(a,len);
return 0;
}
//交换函数
void swap(int a[],int i,int j)
{
int tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
//打印函数
void printA(int *a,int len)
{
int i;
for(i=0;i<len;i++)
{
printf("%4d",a[i]);
}
printf("\n");
}
//冒泡排序
int main1()
{
int a[10]={2,4,6,1,7,9,3,8,0,5};
int len=sizeof(a)/sizeof(a[0]);
int i,j;
for(i=0;i<len-1;i++)
{
for(j=0;j<len-i-1;j++)
{
if(a[j]>a[j+1])
{
swap(a,j,j+1);
}
}
}
printA(a,len);
return 0;
}
//鸡尾酒排序
int main2()
{
int a[10]={2,4,6,1,7,9,3,8,0,5};
int len=sizeof(a)/sizeof(a[0]);
int i;
int left=0;
int right=len-1;
while(left<right)
{
for(i=left;i<right;i++)
{
if(a[i]>a[i+1])
{
swap(a,i,i+1);
}
}
right--;
for(i=right;i>left;i--)
{
if(a[i-1]>a[i])
{
swap(a,i,i-1);
}
}
left++;
}
printA(a,len);
return 0;
}
//选择排序
int main3()
{
int a[10]={2,4,6,1,7,9,3,8,0,5};
int len=sizeof(a)/sizeof(a[0]);
int i,j;
int min;//保存最小数的下标
for(i=0;i<len-1;i++)
{
min=i;
for(j=i+1;j<len;j++)
{
if(a[min]>a[j])
{
min=j;
}
}
if(min!=i)
{
swap(a,i,min);
}
}
printA(a,len);
return 0;
}
//插入排序
int main4()
{
int a[10]={2,4,6,1,7,9,3,8,0,5};
int len=sizeof(a)/sizeof(a[0]);
int get;
int i,j;
for(i=1;i<len;i++)
{
get=a[i]; //抓牌
j=i-1;
while(j>=0&&a[j]>get)
{
a[j+1]=a[j];
j--;
}
a[j+1]=get;
}
printA(a,len);
return 0;
}
//二分插入排序
int main5()
{
int a[10]={2,4,6,1,7,9,3,8,0,5};
int len=sizeof(a)/sizeof(a[0]);
int left,right,mid,i,j,get;
for(i=1;i<len;i++)
{
get=a[i];
left=0;
right=i-1;
while(left<=right)
{
mid=(left+right)/2;
if(a[mid]>get)
{
right=mid-1;
}
else
{
left=mid+1;
}
}
for(j=i-1;j>=left;j--)
{
a[j+1]=a[j];
}
a[left]=get;
}
printA(a,len);
return 0;
}
//希尔排序
int main6()
{
int a[10]={2,4,6,1,7,9,3,8,0,5};
int len=sizeof(a)/sizeof(a[0]);
int i,j,get;
int d=len;
do
{
d=d/3+1;
for(i=d;i<len;i++)
{
get=a[i];
j=i-d;
while(j>=0&&a[j]>get)
{
a[j+d]=a[j];
j-=d;
}
a[j+d]=get;
}
}while(d>1);
printA(a,len);
return 0;
}
//堆排序
void heapify(int *a,int i,int len)
{
int left=2*i+1;
int right=2*i+2;
int max=i;
if(left<len&&a[left]>a[max])
max=left;
if(right<len&&a[right]>a[max])
max=right;
if(max!=i)
{
swap(a,i,max);
heapify(a,max,len);
}
}
void heapsort(int *a,int len)
{
//建堆
int i;
for(i=len/2-1;i>=0;i--)
{
heapify(a,i,len);
}
//排序
for(i=len-1;i>0;i--)
{
swap(a,0,i);
len--;
heapify(a,0,len);
}
}
int main7()
{
int a[10]={2,4,6,1,7,9,3,8,0,5};
int len=sizeof(a)/sizeof(a[0]);
heapsort(a,len);
printA(a,len);
return 0;
}
//归并排序
void merge(int *a,int left,int mid,int right,int *tmp)
{
int i=left;
int j=mid+1;
int k=0;
while(i<=mid&&j<=right)
{
if(a[i]>a[j])
tmp[k++]=a[j++];
else
tmp[k++]=a[i++];
}
while(i<=mid)
tmp[k++]=a[i++];
while(j<=right)
tmp[k++]=a[j++];
k=0;
for(i=left;i<=right;i++)
{
a[i]=tmp[k++];
}
}
void mergesort(int *a,int left,int right,int *tmp)
{
if(left>=right)
return;
int mid=(left+right)/2;
mergesort(a,left,mid,tmp);
mergesort(a,mid+1,right,tmp);
merge(a,left,mid,right,tmp);
}
int main8()
{
int a[10]={2,4,6,1,7,9,3,8,0,5};
int len=sizeof(a)/sizeof(a[0]);
int tmp[10];
mergesort(a,0,len-1,tmp);
printA(a,len);
return 0;
}
//快速排序
int partition(int *a,int left,int right)
{
int pivot=a[right];
int index=left;
int i;
for(i=left;i<right;i++)
{
if(a[i]<pivot)
{
swap(a,i,index);
index++;
}
}
swap(a,index,right);
return index;
}
void qsort(int *a,int left,int right)
{
if(left<right)
{
int pivot=partition(a,left,right);
qsort(a,left,pivot-1);
qsort(a,pivot+1,right);
}
}
int main9()
{
int a[10]={2,4,6,1,7,9,3,8,0,5};
int len=sizeof(a)/sizeof(a[0]);
qsort(a,0,len-1);
printA(a,len);
return 0;
}
阅读全文
0 0
- 今天课上所听的9种排序!
- 今天去听了范平治的课
- 总结今天的所做所为
- 今天所遇到的问题
- 今天的李开复的讲座听不成了,伤心啊
- 今天听得好多老的电影的配乐啊
- 今天听了张孝祥讲座的讲座,分享两段张孝祥经典语录
- 今天听了张孝祥讲座的讲座,分享两段张孝祥经典语录
- Shinning - 我所听过最棒的演讲
- 我所听过的 算法||思想||算法名词
- 飞机上听一对父女的对话
- 今天笔试时候所遇到的题
- 今天C#所遇到的问题杂记
- 今天所遇到的一些问题
- 今天听了2首歌曲
- 今天听了一个讲座
- 今天听了求职交流
- 王菲 单行道 今天忽然听
- JDBC基础学习总结
- 还是畅通工程(最小生成树&&并查集)
- 成员变量、类变量(静态变量)、局部变量的区别
- 【JavaScript】页面加载 解决Uncaught TypeError: Cannot set property of undefined at
- 无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)
- 今天课上所听的9种排序!
- 4.多线程之守护线程
- C++ STL Map的创建、删除、插入、更新、遍历
- 著名的show_space
- cglib动态代理
- Golang版Tensorflow安装记录
- leetcode之分治总结
- 如何快速全面建立自己的大数据知识体系
- 大数相乘问题(java版)