c语言期末复习----排序算法

一、冒泡排序 

思想:两两相邻元素比较,不满足顺序就交换,满足顺序就找下一对

升序代码:

void Bubble_sort(int* a, int len)
{   //每一轮将最大的排到最后,n个元素需要n-1轮
	for (int i = 0; i < len - 1; i++)
	{   //i轮后i个已经排好就不用再两两比较了
		for (int j = 0; j < len - 1 - i; j++)
		{
			if (a[j] > a[j + 1])
			{
				int temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;//注意这里最后是写temp不要又写成a[j]
			}
		}
	}
}
int main()
{
	int arr[10]={ 9,2,34,8,3,1,14,6,17,71};
	int len = sizeof(arr)/sizeof(arr[0]);//求数组的长度要记得除以每一个数组元素的大小
	Bubble_sort(arr, len);
	for (int i = 0; i 

如果想要降序把a[j]和a[j+1]的比较条件改一下

对冒泡排序内部的代码优化


void Bubble_sort(int* a, int len)
{
	bool flag = true;
	for (int i = 0; i < len - 1&&flag; i++)
	{
		flag = false;//假设当前序列已经完成排序
		for (int j = 0; j < len - 1 - i; j++)
		{
			if (a[j] > a[j + 1])//如果不执行该if里的语句,则代表排序已经完成,外层i循环不再执行
			{
				int temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
				flag = true;
			}
		}
	}
}

二、选择排序

思想:从小到大升序,每轮都在剩下的数里面选最小的换到前面/如果是降序就选最大的

每轮排好一个元素,总共n-1轮

升序版 

int main()
{
	int a[10] = { 20,27,31,18,29,38,35,12,23,14 };
	int k = 0;//mark剩下的数中最小的下标
	for (int i = 0; i < 9; i++)
	{
		k = i;
		for (int j = i + 1; j < 10; j++)
		{
			if (a[j] < a[k])
				k = j;
		}
		//把最小的数放到最前面
		int t = a[i];
		a[i] = a[k];
		a[k] = t;
	}
	for (int i = 0; i < 10; i++)
		printf("%d ", a[i]);
}

 三、插入排序法

思想:依次将每个元素插入到前面有序的部分

 (摸扑克牌整理的感觉)

直接插入排序

int main()
{
	int a[10] = { 20,27,31,18,29,38,35,12,23,14 };
	int temp = 0;
	for (int i = 1; i < 10; i++)
	{
		temp = a[i];//用temp存a[i],独立于数组,移动的时候不会被覆盖仍然可以取出进行比较
		for (int j = i - 1; j >= 0; j--)//倒着比较
		{
			if (temp < a[j])
			{
				a[j + 1] = a[j];
				a[j] = temp;
			}
		}
	}
	for (int i = 0; i < 10; i++)
		printf("%d ", a[i]);
}

四、合并排序法 

Example: 将两个已排序(升序)的数组a、b,合并后存放再另一个数组c中,且合并后的数列也是有序数列

思想:

首先各取数组a和b的第1个元素进行比较,将较小元素存为数组c的第1个元素;

接着取刚才比较中较小元素所在数组的下一个元素,与另一数组中刚才比较中的较大元素进行比较,将本次的较小元素存为数组c的第2个元素; …

重复上述比较过程,直到某一个数组先比较完; //先比完说明另一个没比完的数组中剩下的数都比xx更大,所以只需要将另一个数组中未比完的元素依次存入C数组的后续元素中,即完成有序数组的合并。 

int main()
{
    int i=0, j=0, k = 0;
    int a[5] = { 1,3,5,7,9 };
    int b[7] = { 2,4,6,8,10,12,14 };
    int c[12];
    while (i <= 4 && j <= 6)
    {
        if (a[i] > b[j])
        {
            c[k] = b[j];
            k++;
            j++;
        }
        else
        {
            c[k] = a[i];
            k++;
            i++;
        }      
    }
    if (i <= 4)
    {
        for (int p = i; p <= 4; p++)
        {
            c[k] = a[p];
            k++;
        }
    }
    else
    {
        for (int p = j; p <= 6; p++)
        {
            c[k] = b[p];
            k++;
        }
    }
    for (int p = 0; p < 12; p++)
        printf("%d ", c[p]);
}

你可能感兴趣的:(排序算法,算法)