排序算法在计算机语言中都涉及。下面学习几种常见的排序算法。
以下动态图片来自菜鸟教程。
冒泡排序
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;
}
}
}
}
选择排序
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]);
}*/
}
}
插入排序
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;
}
}
希尔排序
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;
}
}
}
并归排序
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);
}
快速排序
- 经过一定的了解发现一些问题
- 冒泡排序具有普适性,稳定性。
- 稳定性在排序中很重要。
其他需要的知识在后面学习的时候再返回学习。