简单的排序算法实现

闲来无事,简单回顾了一下排序算法

  • 简单插入排序,哈希排序
  • 冒泡排序,快速排序
  • 简单选择排序,堆排序
#include <stdio.h>
#include<stdlib.h>

void insertSortForward(int orig[], int size);
void insertSortBackward(int orig[], int size);
void bubbleSort(int orig[], int size);
void selectSort(int orig[], int size);
void shellSort(int orig[], int size);
void HeapSort(int orig[], int size);
void QuickSort(int[], int, int);
void swap(int *, int *);
int Partition(int orig[], int left, int right);
void BuildHeap(int orig[],int size);
void HeapAdjust(int[], int, int);

int main() {
	int a[] = { 1,3,2,4,5,7,0,8,8 };
	//bubbleSort(a, 7);
	//insertSortForward(a, 8);
	//insertSortBackward(a, 8);
	//selectSort(a, 8);
	//shellSort(a, 8);
	//HeapSort(a, 9);
	QuickSort(a, 0, sizeof(a)/sizeof(a[0])-1);
	for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
		printf("%d ", a[i]);
	printf("
");
	system("pause");
	return 0;
}

void shellSort(int orig [], int size) //Shell排序
{
	int i, j, k, t;
	k = (size / 2) % 2 == 0 ? size / 2 + 1 : size / 2; 
	while (k > 0)
	{
		for (int j = k; j < size; j++) {
			t = orig[j];
			i = j - k;
			while (i >= 0 && t < orig[i]) {
				orig[i+k] = orig[i];
				orig[i] = t;
				i = i - k;
			}
		}
		k /= 2;
		if (k==0)
		{
			break;

		}
	}
	for (int i = 0; i < size; i++)
		printf("%d ", orig[i]);
	printf("
");
		
}
void HeapSort(int orig[], int size)
{
	BuildHeap(orig, size);
	for (int i = 0; i < size; i++)
		printf("%d ", orig[i]);
	printf("
");
	while(size > 0)
	{
		printf("%d ", orig[0]);
		orig[0] = orig[ --size];
		HeapAdjust(orig, 0,size);
	}
}
void QuickSort(int orig[], int left, int right)
{
	if (left < right) {

		int point = Partition(orig, left, right);
		QuickSort(orig, left, point - 1);
		QuickSort(orig, point + 1, right);
	}
}
void swap(int *a, int*b) {
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}
int Partition(int orig[], int left, int right)
{
	int prikey = orig[right]; 
	while (left<right)
	{
		while (left<right&&prikey >= orig[left]) left++;
		swap(&orig[left], &orig[right]);
		while (left<right&& prikey <= orig[right]) right--;
		swap(&orig[left], &orig[right]);
	}
	return left;
}
void BuildHeap(int orig[], int size)
{
	int k;
	for (k=size/2-1; k>=0; k--)
	{
		HeapAdjust(orig, k, size);
	}
	

}
void HeapAdjust(int orig[], int adjustPort, int size) {
	
	int min;   //记录左右节点中最小的
	int nextPoint; // 下一步
	while (adjustPort*2+1<size-1) // 还有孩子
	{	
		int leftChild = adjustPort * 2+1;
		int rightChild = adjustPort * 2 + 2;
		min = orig[leftChild];
		nextPoint = leftChild;
		if (rightChild<=size-1&&orig[rightChild]<orig[leftChild])
		{
			min = orig[rightChild];
			nextPoint = rightChild;
		}
		if (orig[adjustPort]>min)
		{
			orig[nextPoint] = orig[adjustPort];
			orig[adjustPort] = min;
			adjustPort = nextPoint;
		}
		else
		{
			break;
		}
	}
}
void insertSortForward(int orig[], int size)
{
	int i, j;
	for (i = 1; i < size; i++) {
		int temp = orig[i];
		int index = i;
		j = i - 1;
		while (j >= 0 && orig[j] > temp)
		{
			orig[index] = orig[j];
			index = j;
			j--;
		}
		orig[j + 1] = temp;
	}
	for (int i = 0; i < size; i++)
		printf("%d ", orig[i]);
	printf("
");
}

void insertSortBackward(int orig[], int size) // 从后往前
{
	int i, j;
	int left, right;
	for (i = 1; i < size; i++) {
		for (j = 0; j < i; j++) {
			if (orig[i] <= orig[j])
			{
				left = orig[i];
				right = i;
				while (i - j)
				{
					orig[i] = orig[i - 1];
					i--;
				}
				i = right;
				orig[j] = left;
			}
		}
		
	}
	for (int i = 0; i < size; i++)
		printf("%d ", orig[i]);
	printf("
");
}

void bubbleSort(int orig[], int size) {
	int i = 0;
	int j = 0;
	for (i = 0; i < size; i++) {
		for (j = 0; j < size - i; j++) {
			if (orig[j] > orig[j + 1]) {
				int temp = 0;
				temp = orig[j];
				orig[j] = orig[j + 1];
				orig[j + 1] = temp;
			}
		}
	}
	for (int i = 0; i < size; i++)
		printf("%d ", orig[i]);
	printf("
");
}

void selectSort(int orig[], int size)
{
	for (int i = 0; i < size; i++) {
		int min = orig[i];
		int index = i;
		for (int j = i+1; j < size; j++)
		{
			if (min > orig[j]) {
				min = orig[j];
				index = j;
			}
		}
		orig[index] = orig[i];
		orig[i] = min;
	}
	for (int i = 0; i < size; i++)
		printf("%d ", orig[i]);
	printf("
");
}
原文地址:https://www.cnblogs.com/liuroy/p/6220841.html