C语言常用排序算法---冒泡排序,选择排序,快速排序

冒泡排序:两两之间进行比较,把大的移到后面,每轮比较之后之后一个就是最大的

#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);   /*继续处理右边的数,这是一个递归过程 */
 
}
 

猜你喜欢

转载自blog.csdn.net/wzk456/article/details/87933689