Six sorting algorithms (function form and test)
(1) Bubble sort
(2) Selection sort
(3) Insertion sort
(4) Merge sort
(5) Quick sort (non-random/random)
(6) Hill sort
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
//冒泡排序
void BubbleSort(int arr[],int length)
{
for(int i = 0; i < length; i++)
{
for(int j = 0; j < length - i - 1; j++)
{
if(arr[j] > arr[j+1])
{
int tmp;
tmp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = tmp;
}
}
}
}
//选择排序
void SelecrionSort(int arr[],int length)
{
for(int i = 0 ; i < length; i++)
{
int index = i;
for(int j = i+1; j < length; j++)
{
if(arr[j] < arr[index])
{
index = j;
}
}
if(index == i)
continue;
else
{
int tmp;
tmp = arr[index];
arr[index] = arr[i];
arr[i] = tmp;
}
}
}
//插入排序
void InsertSort(int arr[],int length)
{
int tmp; //定义一个临时变量,用于交换数据时存储
for(int i = 1; i < length; i++) //遍历
{
for(int j = 0; j < i; j++) //第二层循环主要用于对已排好序的序列进行扫描,和要插入进来的数据进行逐一比较,然后决定插入到哪里
{
if(arr[j] > arr[i])
{
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
}
//分组归并
void _Merge(int *a, int begin1, int end1, int begin2, int end2, int *tmp)
{
int index = begin1;
int i = begin1, j = begin2;
//注意:当划分的区间足够小时,begin1==end1,begin2==end2
while (i <= end1 && j <= end2)
{
if (a[i] <= a[j])
tmp[index++] = a[i++];
else
tmp[index++] = a[j++];
}
//将左边元素填充到tmp中
while (i <= end1)
tmp[index++] = a[i++];
//将右边元素填充的tmp中
while (j <= end2)
tmp[index++] = a[j++];
//将tmp中的数据拷贝到原数组对应的序列区间
//注意:end2-begin1+1
memcpy(a + begin1, tmp + begin1, sizeof(int)*(end2 - begin1 + 1));
}
//归并排序
void MergeSort(int *a, int left, int right, int *tmp)
{
if (left >= right)
return;
assert(a);
//mid将数组二分
int mid = left + ((right - left) >> 1);
//左边归并排序,使得左子序列有序
MergeSort(a, left, mid, tmp);
//右边归并排序,使得右子序列有序
MergeSort(a, mid + 1, right, tmp);
//将两个有序子数组合并
_Merge(a, left, mid, mid + 1, right, tmp);
}
//快速排序 -- 分区(非随机)
int Partition(int *arr,int length,int start,int end)
{
if(NULL == arr || length <= 0 || start < 0 || end <= 0 || end > length)
return -1;
int baseVal = arr[start];
int m_start = start;
int m_end = end;
while(m_start < m_end)
{
while(m_start < m_end && arr[m_end] > baseVal) //从右向左找比基准数小的数,至少有个是等于的
--m_end;
if(m_start < m_end)
{
arr[m_start] = arr[m_end];
++m_start;
}
while(m_start < m_end && arr[m_start] < baseVal) //从左向右找比基准数大的数
++m_start;
if(m_start < m_end)
{
arr[m_end] = arr[m_start];
--m_end;
}
}
arr[m_start] = baseVal; //把基准数放到i的位置
return m_start;
}
//快速排序 -- 分区(非随机/随机)
void Swap(int *a,int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int PartitionRam(int *arr,int length,int start,int end)
{
if(NULL == arr || length <= 0 || start < 0 || end <= 0 || end > length)
return -1;
int random = rand()%(end-start+1) + start;
int small = start - 1;
Swap(&arr[random],&arr[end]);
for(int i = start; i < end; ++i) //非随机快排和随机快排的循环是不一样的
{
if(arr[i] < arr[end])
{
++small;
if(i != small)
{
Swap(&arr[small],&arr[i]);
}
}
}
++small;
Swap(&arr[small],&arr[end]);
return small;
}
//快速排序
void QuickSort(int *arr,int length,int start,int end)
{
if(start == end)
return ;
int index = PartitionRam(arr,length,start,end);
if(index > start)
QuickSort(arr,length,start,index-1);
if(index < end)
QuickSort(arr,length,index+1,end);
}
//希尔排序
void ShellSort(int arr[],int length)
{
int increasement = length;
int i,j,k;
do
{
//确定分组增量
increasement = increasement/3 + 1;
for(i = 0; i < increasement; i++)
{
for(j = i+increasement; j < length; j+=increasement)
{
if(arr[j] < arr[j-increasement])
{
int temp = arr[j];
for(k = j - increasement; k>=0 && temp<arr[k];k -= increasement)
{
arr[k+increasement] = arr[k];
}
arr[k+increasement] = temp;
}
}
}
}while(increasement > 1);
}
int main()
{
int arr[10] = {
9,3,8,1,0,5,7,6,2,4};
printf("冒泡排序:\n");
BubbleSort(arr,10);
for(int i = 0; i < 10; i++)
{
printf("%d,",arr[i]);
}
printf("\n");
printf("选择排序:\n");
int arr1[10] = {
9,3,8,1,0,5,7,6,2,4};
SelecrionSort(arr1,10);
for(int i = 0; i < 10; i++)
{
printf("%d,",arr1[i]);
}
printf("\n");
printf("插入排序:\n");
int arr2[10] = {
9,3,8,1,0,5,7,6,2,4};
InsertSort(arr2,10);
for(int i = 0; i < 10; i++)
{
printf("%d,",arr2[i]);
}
printf("\n");
printf("归并排序:\n");
int arr3[10] = {
9,3,8,1,0,5,7,6,2,4};
int *tmp = (int *)malloc(sizeof(int)*(sizeof(arr3) / sizeof(int)));
memset(tmp, -1, sizeof(arr3) / sizeof(int));
MergeSort(arr3, 0, sizeof(arr3) / sizeof(int)-1, tmp);
for(int i = 0; i < 10; i++)
{
printf("%d,",arr3[i]);
}
free(tmp);
printf("\n");
printf("快速排序:\n");
int arr4[10] = {
9,3,8,1,0,5,7,6,2,4};
QuickSort(arr4,sizeof(arr4)/sizeof(int),0,sizeof(arr4)/sizeof(int)-1);
for(int i = 0; i < 10; i++)
{
printf("%d,",arr4[i]);
}
printf("\n");
printf("希尔排序:\n");
int arr5[10] = {
9,3,8,1,0,5,7,6,2,4};
ShellSort(arr5,sizeof(arr5)/sizeof(int));
for(int i = 0; i < 10; i++)
{
printf("%d,",arr5[i]);
}
printf("\n");
return 0;
}
The complexity of the sorting algorithm
This article is just to record the review code