1.冒泡排序法
原理如下:每次比较数组中相邻的两个数组元素的值,将较小的数排在较大的数前面,可实现数组元素的从小到大排序;每次将较大的数排在较小的数前面,可实现数组元素从大到小排序。
/**每次比较数组相邻的两个元素,将大的元素放在前面**/
//冒泡排序从小到大
void fun(int arr[],int n) //定义一个数组arr[],次数n;
{
int i,j,temp;
for(i = 0; i < n-1; i++) //比较的次数,
{
for(j = 0; j < n-1-i; j++)//每次需要的比较两个相邻元素的次数
{
if(arr[j] > arr[j+1])
{
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
int main(int argc,char *argv[])
{
int i;
int arr[10];
for(i = 0; i < 10; i++)
{
scanf("%d",&arr[i]);
}
fun(arr,10);
for(i = 0; i < 10; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
/**每次比较数组相邻的两个元素,将大的元素放在前面**/
//冒泡排序从大到小
void fun1(int arr[],int n) //定义一个数组arr[],次数n;
{
int i,j,temp;
for(i = 0; i < n-1; i++) //比较的次数,
{
for(j = 0; j < n-1-i; j++)//每次需要的比较两个相邻元素的次数
{
if(arr[j] < arr[j+1])
{
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
int main(int argc,char *argv[])
{
int i;
int arr[10];
for(i = 0; i < 10; i++)
{
scanf("%d",&arr[i]);
}
fun1(arr,10);
for(i = 0; i < 10; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
2.选则排序法
原理如下:每次在待排序的数组中查找到最大或最小的数组元素,将其值与最前面没有进行过排序的数组元素的值交换;
#include <stdio.h>
/**选择排序从小到大排序**/
int main(int argc, char* argv[])
{
int i, j=0, temp;
int arr[5] = { 5,3,4,1,2 };
for (i = 0; i< 4; i++)
{
for (j = i + 1; j < 5; j++)
{
if (arr[i] > arr[j])
{
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
for (i = 0; i < 5; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
4.快速排序法
原理:从冒泡排序演变来的算法,使用了分治法,
首先确定数组元素第一个位置的元素为基准元素。
第一个元素的位置为L。最后一个元素的位置为R。
先用基准元素从右往左遍历,如果大于就交换,没有大于,R--;
再用基准元素从左往右遍历,如果大于于就交换,没有大于,L++;
最后插入基准值;
在对左右部分重复上述步骤;
void fun(int arr[],int start,int end)
{
if(start >= end)
{
return;
}
int left = start; //定义一个指向数组第一个元素的指针
int right = end; //定义一个指向数组最后一个元素的指针
int pivot = arr[left]; //取出一个基准值,一般为数组第一个值
while(left < right) //左边元素的指针必须小于右边元素的指针
{
/**右边放左边**/
while(arr[right] > pivot && left < right) //如果右边的位置的值大于基准值,并且左边指针小于右边指针
{
right--; //直到右边位置的值小于或者等于基准值,不再 -
}
if(right > left )
{
arr[left] = arr[right];
left++;
}
/**左边放右边**/
while(arr[left] < pivot && left < right)
{
left++;
}
if(left < right)
{
arr[right] = arr[left];
right--;
}
}
arr[left] = pivot; //将基准值插入中间,现在left 和 right 都指向基准值的指针
fun(arr,start,left - 1); //重新排序基准左边
fun(arr,right+1,end); //重新排序基准值右边
}
int main(int argc,char *argv[])
{
int i;
int arr[5] = {3,1,2,5,4};
fun(arr,0,sizeof(arr)/sizeof(arr[0]));
for(i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}