一组数排序

小伙伴们刚接触到c语言编程时,排序肯定是会经常遇到的问题类型,这里贴出冒泡排序和选择排序的代码

冒泡排序bubble_sort  :动态感觉上是最大值(或最小值)经过依次遍历后,不断下沉(或上浮)出来。第一次遍历,这组数最大的(或最小值)显现出来,出现在数组的开头或结尾,然后可以对剩下的数组在进行一遍操作,这样慢慢的最值依次被选出并排好序。


选择排序select_sort   :顾名思义,从头开始,选出第一个数作为标记,然后从后面的数组中找出最小的和标记位比较,若是标记位大一些,则交换位置。这样的话经过一遍循环,最小值就出现在第一位了。


代码:



#include <stdio.h>
#include <stdlib.h>
#define max 10


void bubble_sort(int a[], int n)
{
	int t,i,j;
	for(i = n-1; i >= 0; i--){   //从最后以为开始设置标签,标签从最后一位左移
		for(j = 0 ; j < i ; j++){ //然后从第一位到标签为依次遍历
			if(a[j] < a[j+1]){ //如果有前一项比后一项小的
				t = a[j];  //就交换位置,让小的放在后面
				a[j] = a[j+1];
				a[j+1] = t;    //第一遍循环下来,最小的位肯定是最后一位
			}
		}
	}
}

void select_sort(int a[], int n)
{
	int k,i,j,temp;
	for(i = 0;i<n;i++){
		k = i;                    //从第一位开始做标记
		for(j = i+1;j<n;j++){     //从标记位的下一位遍历到最后一位
			if(a[j]<a[k]){    //如果出现比标记位小的,则改变标志位,设置小的为标志位
				k = j;    
			}
		} 
		if(k != i){                //每一次遍历之后,标志位上的是最小位,此时与原标记项比较,若是标记位改变,则交换两次的值
		 	temp = a[i];       //这么做一轮下来,小的是第一位
			a[i] = a[k];
			a[k] = temp;
		}
	}
}

int main()
{
    int a[max] = {20,10,25,9,90,6,21,1,3,35};

    //bubble_sort(a,10);
    select_sort(a,10);
    int i;
    for(i = 0; i < 10; i ++){
	printf("%d ",a[i]);
    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/young_Tao/article/details/78299656