排序
快速排序,希尔排序、冒泡排序、插入排序、归并排序、堆排序
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
#define ERROR 0
#define OK 1
#define MAX_QSIZE 5
#define INCREMENT 2
int printArray(int *arr, int len)
{
printf("array = { ");
for(int i=0; i<len; i++)
{
printf("%d, ", arr[i]);
}
printf("}\n");
}
void bubbleSort(int *arr, int len)
{
for(int i=len-2; i>=0; i--)
{
for(int j=0; j<=i; j++)
{
if(arr[j] > arr[j+1])
{
int t;
t = arr[j];
arr[j] = arr[j+1];
arr[j+1] = t;
}
}
}
printArray(arr, len);
}
void insertSort(int *arr, int len)
{
for(int i=0; i<=len-2; i++)
{
int minIndex = i;
int t;
for(int j=i+1; j<=len-1; j++)
{
if(arr[minIndex] > arr[j])
{
minIndex = j;
}
}
t = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = t;
}
printArray(arr, len);
}
int partition(int *arr, int low, int high)
{
int pivot = arr[low];
while(low < high)
{
while(low<high && arr[high] >= pivot) {--high;}
arr[low] = arr[high];
while(low<high && arr[low] <= pivot) {++low;}
arr[high] = arr[low];
}
arr[low] = pivot;
return low;
}
void quickSort(int *arr, int low, int high)
{
if(low < high)
{
int pivotPos = partition(arr, low, high);
quickSort(arr, low, pivotPos-1);
quickSort(arr, pivotPos+1, high);
}
}
void shellSort(int *arr, int len)
{
int t;
int j;
for(int dk=(len-1)/2; dk>=1; dk=dk/2)
{
for(int i=dk; i<len; i++)
{
if(arr[i] < arr[i-dk])
{
t = arr[i];
for(j=i-dk; j>=0&&t<arr[j]; j-=dk)
{
arr[j+dk] = arr[j];
}
arr[j+dk] = t;
}
}
printArray(arr, len);
}
}
void mergeArray(int *arr, int low, int mid, int high)
{
if(mid<low || high <= mid)
{
return;
}
int *pTemp = (int *)malloc((high - low + 1)*sizeof(int));
for(int i=low; i<=high; i++)
{
*(pTemp + i-low) = *(arr+i);
}
int i = 0;
int j = mid - low + 1;
for(int k=low; k<=high; k++)
{
if(i + low > mid)
{
*(arr + k) = *(pTemp + j);
j++;
}
else if(j + low > high)
{
*(arr + k) = *(pTemp + i);
i++;
}
else if(*(pTemp + j) < *(pTemp + i))
{
*(arr + k) = *(pTemp + j);
j++;
}
else
{
*(arr + k) = *(pTemp + i);
i++;
}
}
free(pTemp);
}
void mergeSort(int *arr, int len)
{
for(int sz=1; sz<len; sz = sz*2)
{
for(int low=0; low<len-sz; low = low+2*sz)
{
mergeArray(arr, low, low+sz-1, (low+2*sz-1)<(len-1)?(low+2*sz-1):(len-1));
}
}
}
void swap(int *num_a, int *num_b)
{
int temp = *num_b;
*num_b = *num_a;
*num_a = temp;
}
void heapAdjust(int *arr, int i, int len)
{
int nChild, nTemp;
for(nTemp=arr[i]; 2*i+1<len; i=nChild)
{
nChild = 2*i+1;
if(nChild != len-1 && arr[nChild+1] > arr[nChild])
{
++nChild;
}
if(nTemp < arr[nChild])
{
arr[i] = arr[nChild];
}
else
{
break;
}
}
arr[i] = nTemp;
}
void heapSort(int *arr, int len)
{
for(int i=len/2-1; i>0; --i)
{
heapAdjust(arr, i, len);
}
for(int i=len-1; i>0; --i)
{
swap(&arr[0], &arr[i]);
heapAdjust(arr, 0, i);
}
}
int main(int argc, char const *argv[])
{
int len;
int arr[] = {49, 38, 24, 35, 87, 45, 53, 49, 96, 4, 18};
len = sizeof(arr) / sizeof(int);
printArray(arr, len);
heapSort(arr, len);
printArray(arr, len);
return 0;
}