常见排序算法(C语言实现)
一、插入排序
void insertSort(int arr[], int n){
int i, j, tmp;
for(i = 1; i < n; i++)
for(j = i; j > 0; j--){
if(arr[j] < arr[j-1]){
tmp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = tmp;
}
else
break;
}
return;
}
二、希尔排序
void shellSort(int arr[], int n){
int i, j, elem;
int k = n/2;
while(k>=1){
for(i = k; i < n; i ++){
elem = arr[i];
for(j = i; j >= k; j-=k){
if(elem < arr[j-k])
arr[j] = arr[j-k];
else
break;
}
arr[j] = elem;
}
k = k/2;
}
}
三、选择排序
void selectSort(int arr[], int n){
int i, j , minValue, tmp;
for(i = 0; i < n-1; i++){
minValue = i;
for(j = i + 1; j < n; j++)
if(arr[minValue] > arr[j])
minValue = j;
if(minValue != i){
tmp = arr[i];
arr[i] = arr[minValue];
arr[minValue] = tmp;
}
}
}
四、堆排序
void AdjustDown(DataType* a, size_t n, int parent){//向下调整
int child = parent * 2 + 1;
while (child < n){//找到最大的孩子
if ((child + 1 < n)&&(a[child+1]>a[child]))
++child;
//进行调整
if (a[child]>a[parent]){
Swap(&a[child], &a[parent]);
parent=child;
child = parent * 2 + 1;
}
else
break;
}
}
void HeapSort(DataType* a, size_t n)//堆排序,大顶堆{
assert(a);
for (int i = (n - 2) / 2; i >= 0; i--)
AdjustDown(a, n, i);//n为元素个数,不是最后一个元素的下表,所以用(n-2)/2
int end = n - 1;
while (end > 0){
Swap(&a[0], &a[end]);
AdjustDown(a, end, 0);//从堆顶开始向下调整,因为有一半已经有序
--end;
}
}
五、冒泡排序
void bubbleSort(int arr[], int n){
int i, j, tmp;
for(i = 0; i < n - 1; i++)
for(j = 1; j < n; j++)
if(arr[j] < arr[j - 1]){
tmp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = tmp;
}
}
六、快速排序
void QuickSort(int *arr, int low, int high){
if (low < high){
int i = low;
int j = high;
int k = arr[low];
while (i < j){
while(i < j && arr[j] >= k)
j--;
if(i < j)
arr[i++] = arr[j];
while(i < j && arr[i] < k)// 从左向右找第一个大于等于k的数
i++;
if(i < j)
arr[j--] = arr[i];
}
arr[i] = k;
// 递归调用
QuickSort(arr, low, i - 1); // 排序k左边
QuickSort(arr, i + 1, high); // 排序k右边
}
其实也可以直接使用C语言提供的qsort进行快排。
int cmpfunc (const void * a, const void * b){
return ( *(int*)a - *(int*)b );
}
int* QuickSort(int* arr, int arrSize){
int *ans=(int*)malloc(sizeof(int) * arrSize);//若直接输出原数组则不需要建立新的数组
qsort(arr,arrSize,sizeof(int),cmpfunc);
for(int i = 0;i < k;i++)//若直接输出原数组则不需要转译新的数组
ans[i] = arr[i];
return ans;//若直接输出原数组则return arr
}
七、归并排序
void merge(int arr[], int l, int mid, int r){
int len,i, pl, pr;
int *tmp = NULL;
len = r - l + 1;
tmp = (int*)malloc(len * sizeof(int));
memset(tmp, 0x0, len * sizeof(int));
pl = l;
pr = mid + 1;
i = 0;
while(pl <= mid && pr <= r) {
if(arr[pl] < arr[pr])
tmp[i++] = arr[pl++];
else
tmp[i++] = arr[pr++];
}
while(pl <= mid)
tmp[i++] = arr[pl++];
while(pr <= r)
tmp[i++] = arr[pr++];
for(i = 0; i < len; i++)
arr[i+l] = tmp[i];
free(tmp);
return;
}