几种排序算法总结:
2016-03-11 18:58
239 查看
几种排序算法总结:
1)冒泡排序
冒泡排序的基本概念是:依次比较相邻的两个数,将大数放在前面,小数放在后面。即首先比较第1个和第2个数,将大数放前,小数放后。然后比较第2个数和第3个数,将大数放前,小数放后,如此继续,直至比较最后两个数,将大数放前,小数放后,此时第一趟结束,在最后的数必是所有数中的最小数。重复以上过程,仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再大于第2个数),将大数放前,小数放后,一直比较到最小数前的一对相邻数,将大数放前,小数放后,第二趟结束,在倒数第二个数中得到一个新的最小数。如此下去,直至最终完成排序。由于在排序过程中总是大数往前放,小数往后放,相当于气泡往上升,所以称作冒泡排序。
主要代码:
void MaopaoSort(int *arr,int n)
{
int temp,i=0,j=0,k=0;
for(i=1;i<n;i++)
{
for(j=0;j<n-i;j++)
{
if(arr[j]>arr[j+1])
{
temp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
}
}
}
}
2)插入排序
每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从后向前扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。
主要代码:
void insertSort(int *a, int n)
{
int i,j,temp;
for(i = 1; i<n; i++)
{
temp = a[i];
j = i-1;
while(j>=0 && temp<a[j])
{
a[j+1] = a[j];
j--;
}
a[j+1] = temp;
}
}
3)选择排序
(1)在一组元素V[i]~V[n-1]中选择具有最小排序码的元素(2)若它不是这组元素中的第个元素,则将它与这一组元素中的第一个元素对调;(3)在这组元素中剔除这个具有最小排序码的元素,在剩下的元素V[i+1]~V[n-1]中重复执行第(1)(2)步,直到剩余元素只有一个为止。
主要代码:
void selectSort(int *a,int n)
{
int i,j,k,temp;
for(i = 0; i<n - 1; i++)
{
k = i;
for(j = i+1; j<n; j++)
{
if(a[k]>a[j])
k = j;
}
if(i==k) continue;
temp = a[i];
a[i] = a[k];
a[k] = temp;
}
}
4)快速排序
首先检查数据列表中的数据数,如果小于两个,则直接退出程序。如果有超过两个以上的数据,就选择一个分割点将数据分成两个部分,小于分割点的数据放在一组,其余的放在另一组,然后分别对两组数据排序;
主要代码:
void quickSort(int *a, int i, int j)
{
int m,n,temp,k;
n = j;m = i;
k = a[(i+j)/2];
do
{
while(a[m]<k && m<j)
m++;
while(a
>k && n>i)
n--;
if(m<=n)
{
temp = a[m];
a[m] = a
;
a
= temp;
m++;
n--;
}
}while(m<=n);
if(m<j)
quickSort(a,m,j);
if(n>i)
quickSort(a,i,n);
}
5) 希尔排序
先取一个正整数d1<n,把所有序号相隔d1的数组元素放一组,组内进行直接插入排序;然后取d2<d1,重复上述分组和排序操作;直至di=1,即所有记录放进一个组中排序为止;
主要代码:(此例中:d1=3)
void shellSort(int *a, int n)
{
int i,j,k,x;
k = n/3;
while(k>=1)
{
for(i = k; i<n; i++)
{
x = a[i];
j = i - k;
while(j>=0 && x<a[j])
{
a[j+k] = a[j];
j-=k;
}
a[j+k] = x;
}
k/=2;
}
}
1)冒泡排序
冒泡排序的基本概念是:依次比较相邻的两个数,将大数放在前面,小数放在后面。即首先比较第1个和第2个数,将大数放前,小数放后。然后比较第2个数和第3个数,将大数放前,小数放后,如此继续,直至比较最后两个数,将大数放前,小数放后,此时第一趟结束,在最后的数必是所有数中的最小数。重复以上过程,仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再大于第2个数),将大数放前,小数放后,一直比较到最小数前的一对相邻数,将大数放前,小数放后,第二趟结束,在倒数第二个数中得到一个新的最小数。如此下去,直至最终完成排序。由于在排序过程中总是大数往前放,小数往后放,相当于气泡往上升,所以称作冒泡排序。
主要代码:
void MaopaoSort(int *arr,int n)
{
int temp,i=0,j=0,k=0;
for(i=1;i<n;i++)
{
for(j=0;j<n-i;j++)
{
if(arr[j]>arr[j+1])
{
temp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
}
}
}
}
2)插入排序
每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从后向前扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。
主要代码:
void insertSort(int *a, int n)
{
int i,j,temp;
for(i = 1; i<n; i++)
{
temp = a[i];
j = i-1;
while(j>=0 && temp<a[j])
{
a[j+1] = a[j];
j--;
}
a[j+1] = temp;
}
}
3)选择排序
(1)在一组元素V[i]~V[n-1]中选择具有最小排序码的元素(2)若它不是这组元素中的第个元素,则将它与这一组元素中的第一个元素对调;(3)在这组元素中剔除这个具有最小排序码的元素,在剩下的元素V[i+1]~V[n-1]中重复执行第(1)(2)步,直到剩余元素只有一个为止。
主要代码:
void selectSort(int *a,int n)
{
int i,j,k,temp;
for(i = 0; i<n - 1; i++)
{
k = i;
for(j = i+1; j<n; j++)
{
if(a[k]>a[j])
k = j;
}
if(i==k) continue;
temp = a[i];
a[i] = a[k];
a[k] = temp;
}
}
4)快速排序
首先检查数据列表中的数据数,如果小于两个,则直接退出程序。如果有超过两个以上的数据,就选择一个分割点将数据分成两个部分,小于分割点的数据放在一组,其余的放在另一组,然后分别对两组数据排序;
主要代码:
void quickSort(int *a, int i, int j)
{
int m,n,temp,k;
n = j;m = i;
k = a[(i+j)/2];
do
{
while(a[m]<k && m<j)
m++;
while(a
>k && n>i)
n--;
if(m<=n)
{
temp = a[m];
a[m] = a
;
a
= temp;
m++;
n--;
}
}while(m<=n);
if(m<j)
quickSort(a,m,j);
if(n>i)
quickSort(a,i,n);
}
5) 希尔排序
先取一个正整数d1<n,把所有序号相隔d1的数组元素放一组,组内进行直接插入排序;然后取d2<d1,重复上述分组和排序操作;直至di=1,即所有记录放进一个组中排序为止;
主要代码:(此例中:d1=3)
void shellSort(int *a, int n)
{
int i,j,k,x;
k = n/3;
while(k>=1)
{
for(i = k; i<n; i++)
{
x = a[i];
j = i - k;
while(j>=0 && x<a[j])
{
a[j+k] = a[j];
j-=k;
}
a[j+k] = x;
}
k/=2;
}
}
相关文章推荐
- chrome日历插件开发
- C++ Primer Plus学习:第二章
- 操作系统作业---实验0
- [置顶] 安卓通知栏管理详解及分析 NotificationListenerService
- 使用Button特效 selector+shape
- mysql数据库优化
- 关于C#判断是否是数字的正则式
- 表单提交单选框
- 循环右移
- C++ Primer Plus学习:第一章
- 九度OJ #1437 To Fill or Not to Fil
- ubuntu 14.04 telnet 服务配置
- 只允许用来代理上网的SSH账号的方法
- 学习进度条
- Bootstrap初探
- Unity3D基础篇-Transform
- HDU2255 奔小康赚大钱【二分图最佳匹配】
- sqlite3---终端操作
- Android开发请求网络方式详解
- 微信支付移动开发