冒泡排序:两两之间进行比较,把大的移到后面,每轮比较之后之后一个就是最大的
#include<stdio.h>
#include<assert.h>
#include<stdlib.h.h>
//从头向尾遍历
//相邻两数进行比较
//将最大数(相对)沉入尾部(相对)
void BubbleSort1(int *arr,int sz){
int i = 0;
int j = 0;
assert(arr);
for
(i=0;i<sz-1;i++){
for
(j=0;j<sz-i-1;j++){
if
(arr[j]>arr[j+1]){
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
}
//从尾向头遍历
//相邻两数进行比较
//将最小数(相对)冒泡到头部(相对)
void BubbleSort2(int *arr,int sz){
int i = 0;
int j = 0;
assert(arr);
for
(i=0;i<sz-1;i++){
for
(j=sz;j>i;j--){
if
(arr[j]>arr[j-1]){
int tmp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = tmp;
}
}
}
}
//测试函数
//为了方便起见,将参数设定为一个函数指针
void TestBubbleSort(void (*BubbleSort)(int *arr,int sz)){
int arr[]={1,3,5,7,9,2,4,6,8,0};
int i = 0;
int sz = sizeof(arr)/sizeof(arr[0]);
BubbleSort(arr,sz);
for
(i=0; i<sz; i++){
printf(
"%d "
,arr[i]);
}
printf(
"\n"
);
}
int main(){
TestBubbleSort(BubbleSort1);
TestBubbleSort(BubbleSort2);
system(
"pause"
);
return
0;
}
选择排序:
思路:每一轮挑选最小的放到最前面 /* 选择排序算法:从小到大排列 */
void SelectSort(void)
{
int i;
int j;
int temp;
scanf("%d",&n); /* 输入数据的长度 */
for(i=0;i<n;i++)/* 输入数据 */
{
scanf("%d",&a[i]);
}
/* 选择排序核心代码 */
for(i=0;i<=n;i++)
{
for(j=i+1;j<=n-1;j++)
{
if(a[i]>a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
for(i=0;i<n;i++)/* 输出数据 */
{
printf("%d ",a[i]);
}
printf("\n");
上面的方法比较笨,可以使用下面的:
void SelectSort(int *arr, int len) { int i,j; // 为循环做准 int iMin; // 存储每次最小值 int temp; // 作为临时存储值 for (i=0; i<len-1; i++) // 进行len-1趟比较即可 { iMin = i; // 存储每次最小值 for (j=i+1; j<len; j++) // 第i次需要与之比较的数据 { if (arr[iMin]>arr[j]) { iMin = j; // 记录最小值的位置 } } temp = arr[i]; // 交换 arr[i] = arr[iMin]; arr[iMin] = temp; } }
/*快速排序算法:序列从小到大排列 */
void QuickSort(int left,int right)
{
int i,j,temp,m;
if(left>right) /* 退出递归的条件判断 */
{
return ;
}
m=a[left]; /* m存的是基准数 */
i=left;
j=right;
while(i!=j)
{
while(a[j]>=m && i<j) /* 先从右往左找序列中比基准数m大的数 */
{
j--;
}
while(a[i]<=m && i<j) /* 再从左往右找序列中比基准数m小的数 */
{
i++;
}
if(i<j) /* 满足条件就将比m大的那个数与比m小的那个数进行交换 */
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
/* 下面两段代码是将基准数归位 */
a[left]=a[i];
a[i]=m;
QuickSort(left,i-1); /* 继续处理左边的数,这是一个递归过程 */
QuickSort(i+1,right); /*继续处理右边的数,这是一个递归过程 */
}