常用排序方法(一)
2009-11-06 23:47
274 查看
冒泡排序:
算法原理:每次前一个元素与后一个元素比较,若前者大则交换。
#include<stdio.h>
void change(int *pData,int count)
{
int a,i,j,p;
for(i=1;i<count;i++)
{
for(j=count-1;j>=i;j--)
{
if(pData[j]<pData[j-1])/*倒序比较*/
{
a=pData[j-1];
pData[j-1]=pData[j];
pData[j]=a;
for(p=0;p<6;p++)/*输出每一次交换后的结果*/
{
printf("%d ",pData[p]);
}
printf("/n");
}
}
printf("**********************/n");/*每一轮之间用此隔开*/
}
}
void main()
{
int i;
int data[]={10,9,5,6,4,3};
change(data,6);
}
选择排序:
排序原理:从数据中选择最小的同第一个值交换,在从剩下的部分中选择最小的与第二个交换,这样往复下去。
#include "stdio.h"
void select(int *pData,int count)
{ int i;
int Temp;
int Pos;
for(i=0;i<count-1;i++)
{ int j;
Temp=pData[i];
Pos=i;
for(j=i+1;j<count;j++)/*找最小元素*/
{
if(pData[j]<Temp)
{
Temp=pData[j];
Pos=j;
}
}
pData[Pos] = pData[i];/*实现交换*/
pData[i] = Temp;
printf("%d***",pData[i]); /*每次的最小值*/
}
}
main()
{ int i;
int data[]={10,9,8,6,7,5};
select(data,6);
printf("/n排序后的结果为:");
for(i=0;i<6;i++)
{
printf("%d ",data[i]);
}
}
交换排序:
排序原理:每次用当前的元素一一的同其后的元素比较并交换
#include "stdio.h"
void change(int *pData,int count)
{
int a,i,j,b;
for(i=0;i<count-1;i++)
{
for(j=i+1;j<count;j++)
{
if(pData[j]<pData[i])
{
a=pData[i];
pData[i]=pData[j];
pData[j]=a;
for(b=0;b<6;b++)/*输出每次交换后的结果*/
{
printf("%d ",pData[b]);
}
printf("/n");
}
}
printf("*******************/n");/*每轮之间用此隔开*/
}
}
main()
{ int i;
int data[]={10,9,7,6,4,8};
change(data,6);
}
插入排序:
排序原理是抽出牌,在前面的牌中寻找相应的位置插入,然后继续下一张
#include "stdio.h"
void Insertsort(int r[],int n)
{
int i,j;
int temp;
for(i=1;i<n;i++)
{
temp=r[i];
j=i-1;
while(j>=0&&temp<r[j])
{
r[j+1]=r[j];
j--;
}
r[j+1]=temp;
}
}
void main()
{ int i;
int arry[]={9,7,8,5,6,3};
Insertsort(arry,6);
for(i=0;i<6;i++)
{printf("%d ",arry[i]);}
}
快速插入法:
排序原理:首先我们选择一个中间值middle程序中我们使用数组中间值,然后
把比它小的放在左边,大的放在右边(具体的实现是从两边找,找到一对后交换)。然后对两边分别使
用这个过程(最容易的方法——递归)。
#include "stdio.h"
void run(int* pData,int left,int right)
{
int i,j;
int middle,iTemp;
i = left;
j = right;
middle = pData[(left+right)/2]; /*求中间值*/
do{
while((pData[i]<middle) && (i<right))/*从左扫描大于中值的数*/
i++;
while((pData[j]>middle) && (j>left))/*从右扫描大于中值的数*/
j--;
if(i<=j)/*找到了一对值*/
{
/*交换*/
iTemp = pData[i];
pData[i] = pData[j];
pData[j] = iTemp;
/////////////
printf("%d***%d/n",pData[i],pData[j]);/*每次参与交换的值*/
////////
i++;
j--;
}
}while(i<=j);/*如果两边扫描的下标交错,就停止(完成一次)*/
/*当左边部分有值(left<j),递归左半边*/
if(left<j)
run(pData,left,j);
/*当右边部分有值(right>i),递归右半边*/
if(right>i)
run(pData,i,right);
}
void QuickSort(int* pData,int Count)
{
run(pData,0,Count-1);
}
void main()
{
int data[] = {10,9,8,7,6,5,4};
QuickSort(data,7);
for (int i=0;i<7;i++)
printf("%d ",data[i]);
}
算法原理:每次前一个元素与后一个元素比较,若前者大则交换。
#include<stdio.h>
void change(int *pData,int count)
{
int a,i,j,p;
for(i=1;i<count;i++)
{
for(j=count-1;j>=i;j--)
{
if(pData[j]<pData[j-1])/*倒序比较*/
{
a=pData[j-1];
pData[j-1]=pData[j];
pData[j]=a;
for(p=0;p<6;p++)/*输出每一次交换后的结果*/
{
printf("%d ",pData[p]);
}
printf("/n");
}
}
printf("**********************/n");/*每一轮之间用此隔开*/
}
}
void main()
{
int i;
int data[]={10,9,5,6,4,3};
change(data,6);
}
选择排序:
排序原理:从数据中选择最小的同第一个值交换,在从剩下的部分中选择最小的与第二个交换,这样往复下去。
#include "stdio.h"
void select(int *pData,int count)
{ int i;
int Temp;
int Pos;
for(i=0;i<count-1;i++)
{ int j;
Temp=pData[i];
Pos=i;
for(j=i+1;j<count;j++)/*找最小元素*/
{
if(pData[j]<Temp)
{
Temp=pData[j];
Pos=j;
}
}
pData[Pos] = pData[i];/*实现交换*/
pData[i] = Temp;
printf("%d***",pData[i]); /*每次的最小值*/
}
}
main()
{ int i;
int data[]={10,9,8,6,7,5};
select(data,6);
printf("/n排序后的结果为:");
for(i=0;i<6;i++)
{
printf("%d ",data[i]);
}
}
交换排序:
排序原理:每次用当前的元素一一的同其后的元素比较并交换
#include "stdio.h"
void change(int *pData,int count)
{
int a,i,j,b;
for(i=0;i<count-1;i++)
{
for(j=i+1;j<count;j++)
{
if(pData[j]<pData[i])
{
a=pData[i];
pData[i]=pData[j];
pData[j]=a;
for(b=0;b<6;b++)/*输出每次交换后的结果*/
{
printf("%d ",pData[b]);
}
printf("/n");
}
}
printf("*******************/n");/*每轮之间用此隔开*/
}
}
main()
{ int i;
int data[]={10,9,7,6,4,8};
change(data,6);
}
插入排序:
排序原理是抽出牌,在前面的牌中寻找相应的位置插入,然后继续下一张
#include "stdio.h"
void Insertsort(int r[],int n)
{
int i,j;
int temp;
for(i=1;i<n;i++)
{
temp=r[i];
j=i-1;
while(j>=0&&temp<r[j])
{
r[j+1]=r[j];
j--;
}
r[j+1]=temp;
}
}
void main()
{ int i;
int arry[]={9,7,8,5,6,3};
Insertsort(arry,6);
for(i=0;i<6;i++)
{printf("%d ",arry[i]);}
}
快速插入法:
排序原理:首先我们选择一个中间值middle程序中我们使用数组中间值,然后
把比它小的放在左边,大的放在右边(具体的实现是从两边找,找到一对后交换)。然后对两边分别使
用这个过程(最容易的方法——递归)。
#include "stdio.h"
void run(int* pData,int left,int right)
{
int i,j;
int middle,iTemp;
i = left;
j = right;
middle = pData[(left+right)/2]; /*求中间值*/
do{
while((pData[i]<middle) && (i<right))/*从左扫描大于中值的数*/
i++;
while((pData[j]>middle) && (j>left))/*从右扫描大于中值的数*/
j--;
if(i<=j)/*找到了一对值*/
{
/*交换*/
iTemp = pData[i];
pData[i] = pData[j];
pData[j] = iTemp;
/////////////
printf("%d***%d/n",pData[i],pData[j]);/*每次参与交换的值*/
////////
i++;
j--;
}
}while(i<=j);/*如果两边扫描的下标交错,就停止(完成一次)*/
/*当左边部分有值(left<j),递归左半边*/
if(left<j)
run(pData,left,j);
/*当右边部分有值(right>i),递归右半边*/
if(right>i)
run(pData,i,right);
}
void QuickSort(int* pData,int Count)
{
run(pData,0,Count-1);
}
void main()
{
int data[] = {10,9,8,7,6,5,4};
QuickSort(data,7);
for (int i=0;i<7;i++)
printf("%d ",data[i]);
}
相关文章推荐
- Python实现的常用排序方法
- PHP常用的四种排序方法及二种查找方法
- 常用排序的实现方法(数据结构)
- C语言中常用三种排序方法
- 常用的内部排序方法-比较排序
- Oracle排序中NULL值处理的五种常用方法
- Collections中的常用方法及排序
- 几种常用的排序方法3--选择排序
- java 运用数组常用的几种排序方法
- 黑马程序员--数组常用排序方法
- 常用排序方法总结
- 四种常用排序方法的基本思想和PHP实现源代码
- 几种常用的C#排序方法简介
- Java常用的排序方法
- Oracle 排序中常用的NULL值处理方法
- js/jquery常用方法(replaceALl、new Map()、点击th(表头)或拖动tr只前台排序)
- 常用排序方法介绍
- Java基础学习应用_数组常用方法与排序(一)
- ElasticSearch之排序使用-ES常用排序方法
- 常用排序方法(二)