我與代碼的日常: 數據結構——排序

“排序”在我們日常生活中用得可謂很頻繁了,例如:淘寶上價格排序,學生成績排序,網站點擊量排序。往往需要我們排序的數據有很多,我們也不可能人爲地進行排序。因此,我們可以利用計算機,進行高效率的數據排序。

1.插入排序:

void InsertSort(int arr[], int size)
{
	int i = 0;
	for (i = 1; i < size; i++)
	{
		int tmp = arr[i];
		int j = 0;
		for (j = i - 1; j >= 0 && arr[j] > tmp; j--)
		{
			arr[j + 1] = arr[j];
		}
		arr[j + 1] = tmp;
	}
}

2.希爾排序:

void InsretWithGap(int arr[], int size, int gap)
{
	int i = 0;
	for (i = gap; i < size; i++)
	{
		int key = arr[i];
		int j = 0;
		for (j = i - gap; j >= 0 && arr[j]>key; j -= gap)
		{
			arr[j + gap] = arr[j];
		}
		arr[j + gap] = key;
	}
}

void ShellSort(int arr[], int size)
{
	int gap = size; 
	while (1)
	{
		gap = gap / 3 + 1;
		InsretWithGap(arr, size, gap);
		if (gap == 1)
		{
			break;
		}
	}
}

3.選擇排序:

void SelectSort(int arr[], int size)
{
	int i = 0;
	for (i = 0; i < size; i++)
	{
		int m = 0;
		int j = 0;
		for (j = 0; j < size - i; j++)
		{
			if (arr[j]>arr[m])
			{
				m = j;
			}
		}
		Swap(arr + m, arr + size - i - 1);
	}
}

4.堆排序:

//向下調整,排升序建大堆
void AdjustDown(int arr[], int size, int r)
{
	int left = 2 * r + 1;
	int right = 2 * r + 2;
	if (left >= size)
	{
		return; //數組越界
	}
	int m = left;
	if (right<size && arr[right]>arr[left])
	{
		m = right;
	}
	if (arr[r] > arr[m])
	{
		return; //滿足對的性質
	}
	Swap(arr + r, arr + m);
	AdjustDown(arr, size, m);
}

//先建堆
void CreatHeap(int arr[], int size)
{
	int i = 0;
	for (i = (size - 1 - 1) / 2; i >= 0; i--)
		//最後一個非葉子節點開始
	{
		AdjustDown(arr, size, i);
	}
}


void HeapSort(int arr[], int size)
{
	int i = 0;
	//先建堆
	CreatHeap(arr, size);
	for (i = 0; i < size; i++)
	{
		Swap(arr, arr + size - 1 - i);
		AdjustDown(arr, size - i - 1, 0);
	}
}

5.冒泡排序:

void BubbleSort(int arr[], int size)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < size; i++)
	{
		for (j = 0; j < size - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
				Swap(arr + j, arr + j + 1);
		}
	}
}

完整的測試代碼如下:(測試環境爲VS2013)

#include<stdio.h>
#include<stdlib.h>

//插入排序
void InsertSort(int arr[], int size)
{
	int i = 0;
	for (i = 1; i < size; i++)
	{
		int tmp = arr[i];
		int j = 0;
		for (j = i - 1; j >= 0 && arr[j] > tmp; j--)
		{
			arr[j + 1] = arr[j];
		}
		arr[j + 1] = tmp;
	}
}

//希爾排序
void InsretWithGap(int arr[], int size, int gap)
{
	int i = 0;
	for (i = gap; i < size; i++)
	{
		int key = arr[i];
		int j = 0;
		for (j = i - gap; j >= 0 && arr[j]>key; j -= gap)
		{
			arr[j + gap] = arr[j];
		}
		arr[j + gap] = key;
	}
}

void ShellSort(int arr[], int size)
{
	int gap = size; 
	while (1)
	{
		gap = gap / 3 + 1;
		InsretWithGap(arr, size, gap);
		if (gap == 1)
		{
			break;
		}
	}
}

//交換函數(選擇排序會用到)
void Swap(int*a, int* b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}
//選擇排序
void SelectSort(int arr[], int size)
{
	int i = 0;
	for (i = 0; i < size; i++)
	{
		int m = 0;
		int j = 0;
		for (j = 0; j < size - i; j++)
		{
			if (arr[j]>arr[m])
			{
				m = j;
			}
		}
		Swap(arr + m, arr + size - i - 1);
	}
}

//堆排序
//向下調整,排升序建大堆
void AdjustDown(int arr[], int size, int r)
{
	int left = 2 * r + 1;
	int right = 2 * r + 2;
	if (left >= size)
	{
		return; //數組越界
	}
	int m = left;
	if (right<size && arr[right]>arr[left])
	{
		m = right;
	}
	if (arr[r] > arr[m])
	{
		return; //滿足對的性質
	}
	Swap(arr + r, arr + m);
	AdjustDown(arr, size, m);
}

//先建堆
void CreatHeap(int arr[], int size)
{
	int i = 0;
	for (i = (size - 1 - 1) / 2; i >= 0; i--)
		//最後一個非葉子節點開始
	{
		AdjustDown(arr, size, i);
	}
}


void HeapSort(int arr[], int size)
{
	int i = 0;
	//先建堆
	CreatHeap(arr, size);
	for (i = 0; i < size; i++)
	{
		Swap(arr, arr + size - 1 - i);
		AdjustDown(arr, size - i - 1, 0);
	}
}

void BubbleSort(int arr[], int size)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < size; i++)
	{
		for (j = 0; j < size - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
				Swap(arr + j, arr + j + 1);
		}
	}
}

//打印函數
void Print(int arr[], int size)
{
	int i = 0;
	for (i = 0; i < size; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

int main()
{
	int arr[] = { 8, 5, 2, 9, -1, 0, 6 };
	int size = sizeof(arr) / sizeof(arr[0]);
	printf("插入排序: ");
	InsertSort(arr, size);
	Print(arr, size);
	printf("希爾排序: ");
	ShellSort(arr, size);
	Print(arr, size);
	printf("選擇排序: ");
	SelectSort(arr, size);
	Print(arr, size);
	printf("堆 排 序: ");
	HeapSort(arr, size);
	Print(arr, size);
	printf("冒泡排序: ");
	HeapSort(arr, size);
	Print(arr, size);
	system("pause");
	return 0;
}

結果如下:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章