C语言学习之路--第十九站 排序算法

22 阅读1分钟

排序算法在计算机语言中都涉及。下面学习几种常见的排序算法。


以下动态图片来自菜鸟教程。

冒泡排序

int bubble_sort_demo(int arr[], int len)
{
int  temp;

for (int i = 0; i < len - 1; i++)
{
	for (int j = 0; j < len - 1 - i ; j++)
	{
		if (arr[j] > arr[j+1])
		{
			temp = arr[j];
			arr[j] = arr[j + 1];
			arr[j + 1] = temp;
		}

	}

}

}

冒泡排序.gif

选择排序

int selection_sort(int a[], int len)
{
int temp = NULL;
for (int i = 0; i < len - 1; i++)
{
	int min = i;
	for (int j = i + 1 ; j < len ; j++)
	{
		if (a[j] < a[min])
		{
			min = j;
		}
	}
	if (min != i)
	{
		temp = a[min];
		a[min] = a[i];
		a[i] = temp;
	}
	/*if (min != i) {
		swap(&a[min], &a[i]);
	}*/
}

}

选择排序.gif

插入排序

int insertion_sort(int arr[], int len)
{
int j,temp;
for (int  i = 1; i < len; i++)
{
	temp = arr[i];

	for ( j = i; j > 0 && arr[j - 1] > temp; j--)
	{
		arr[j] = arr[j - 1];
	}
	arr[j] = temp;


}
}

插入排序.gif

希尔排序

int shell_sort(int arr[], int len)
{
int gap, i, j;
int temp;
for (gap = len >> 1; gap > 0; gap = gap >> 1)
{
	for (i = gap; i < len; i++)
	{
		temp = arr[i];
		for (j = i - gap; j >= 0 && arr[j] > temp; j -= gap)
		{
			arr[j + gap] = arr[j];
		}
		arr[j + gap] = temp; 
	}

}

}

希尔排序.gif

并归排序

int merge_sort(int arr[] , int len )
{
int* a = arr;
int* b = (int*)malloc(len * sizeof(int));
int seg, start;

for(seg = 1 ; seg < len ; seg += seg)
{
	for (start = 0 ; start  < len; start += seg + seg)
	{
		int low = start;
		int mid = min(start + seg, len);
		int high = min(start + seg + seg , len );
	
		int k = low;
		int start1 = low; 
		int end1 = mid;
		int start2 = mid;
		int end2 = high;

		while (start1 < end1 && start2 < end2)
		{
			b[k++] = a[start1] < a[start2] ? a[start1++] : a[start2++];
		}
		while (start1 < end1)
		{
			b[k++] = a[start1++];
		}
		while (start2 < end2)
		{
			b[k++] = a[start2++];
		}

	}
	int* temp = a;
	a = b;
	b = temp;

}
if (a != arr)
{
	int i;
	for (i = 0; i < len; i++)
	{
		b[i] = a[i];
		b = a;
	}
}
free(b);

}

归并排序.gif

快速排序

快速排序.gif

image.png

  • 经过一定的了解发现一些问题
  • 冒泡排序具有普适性,稳定性。
  • 稳定性在排序中很重要。

其他需要的知识在后面学习的时候再返回学习。