排序

排序

快速排序,希尔排序、冒泡排序、插入排序、归并排序、堆排序

#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));
		}
		//printArray(arr, len);
	}
}


//堆排序

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);

	// bubbleSort(arr, len);
	// printArray(arr, len);
	// insertSort(arr, len);
	// printArray(arr, len);
	// quickSort(arr, 0, len-1);
	// printArray(arr, len);
	
	// shellSort(arr, len);
	// printArray(arr, len);

	// mergeSort(arr, len);
	// printArray(arr, len);

	heapSort(arr, len);
	printArray(arr, len);

	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值