常見排序算法實現(c++)

1 排序基本概念

假設含有n個記錄的序列爲r1,r2,...,rnr_1,r_2,...,r_n,其相應的關鍵字分別爲k1,k2,...,knk_1,k_2,...,k_n,需要確定1,2,...,n1, 2, ..., n的一種序列p1,p2,...,pnp1,p2,...,pn,使得其對應的關鍵字滿足kp1,kp2,...kpnk_{p1},k_{p2},...k{pn}(非遞減或非遞增)關係,即使得序列成爲一個按關鍵字有序得序列rp1,rp2,...,rpnr_{p1},r_{p2},...,r_{pn},這樣得操作稱爲排序

1.1 排序的穩定性

ri=rjr_i = r_j,在排序前rir_i領先於rjr_j,如果排序後rir_i仍然領先於rjr_j,則稱爲所用的排序算法是穩定的;反之,若可能使得排序後rjr_j領先於rir_i,則稱爲該排序算法是不穩定的。

1.2 內排序和外排序

內排序:排序的整個過程中,待排序的所有記錄全部存放在內存中。常見的內排序算法有:冒泡排序、簡單選擇排序、直接插入排序、希爾排序、歸併排序、堆排序、快排等

外排序:排序的記錄數太多,不能同時放置在內存中,整個排序過程需要內外存多次交換數據才能進行。

1.3 複雜度分析

算法 複雜度
冒泡排序 O(n2)O(n^2)
簡單選擇排序 O(n2)O(n^2)
直接插入排序 O(n2)O(n^2)
希爾排序 O()O()
堆排序 O()O()
歸併排序 O()O()
快排排序 O()O()

2 代碼實現

2.1 冒泡排序

2.11 最簡單排序(不滿足兩兩比較相鄰記錄)

#include <iostream>
using namespace std;
int main()
{
	int n;
	int a[100];
	cout << "請輸入元素個數:" << endl;
	cin >> n;

	for (int i = 0; i < n; i++)
	{
		cin >> a[i];
	}

	for (int i = 0; i < n - 1; i++)
	{
		for (int j = i + 1; j < n; j++)
		{
			if (a[i] > a[j])
			{
				int temp;
				temp = a[i];
				a[i] = a[j];
				a[j] = temp;
			}
		}
	}	
	for (int i = 0; i < n; i++)
	{
		cout << a[i] << " ";
	}
	cout << endl;

	system("pause");
	system("cls");
	return 0;
}

在這裏插入圖片描述

2.2 冒泡排序法

冒泡排序是一種比較簡單的排序算法。較小的數字如同氣泡一樣慢慢浮到上面,因此命名爲冒泡算法。

注意j從後往前冒泡
比較時,若前者大於後者,則交換次序

#include <iostream>
using namespace std;
int main()
{
	int n;
	int a[100];
	cout << "請輸入元素個數:" << endl;
	cin >> n;

	for (int i = 0; i < n; i++)
	{
		cin >> a[i];
	}

	for (int i = 0; i < n - 1; i++)        
	{
		for (int j = n-1; j >i; j--)
		{
			if (a[j-1] > a[j])                
			{
				int temp;
				temp = a[j-1];
				a[j-1] = a[j];
				a[j] = temp;
			}
		}
	}	
	for (int i = 0; i < n; i++)
	{
		cout << a[i] << " ";
	}
	cout << endl;

	system("pause");
	system("cls");
	return 0;
}

2.3 冒泡排序法優化

若數組

a[4] = {2,1,3,4};

則第一次比較後得到:

a[4] = {1,2,3,4};

第一次排序後即完成,後續遍歷無作用,切浪費運行效率;
引入flag

#include <iostream>
using namespace std;
int main()
{
	int n;
	int a[100];
	bool flag = true;
	cout << "請輸入元素個數:" << endl;
	cin >> n;

	for (int i = 0; i < n; i++)
	{
		cin >> a[i];
	}

	for (int i = 0; i < n - 1 && flag; i++)
	{
		flag = false;
		for (int j = n-1; j >i ; j--)
		{
			if (a[j-1] > a[j])
			{
				int temp;
				temp = a[j-1];
				a[j-1] = a[j];
				a[j] = temp;

				flag = true;
			}
		}
	}	
	for (int i = 0; i < n; i++)
	{
		cout << a[i] << " ";
	}
	cout << endl;

	system("pause");
	system("cls");
	return 0;
}

2.2 簡單選擇排序

代碼實現1:

#include <iostream>
using namespace std;

void selectsort(int a[],int N)
{
	int i=0,j=0,min=0;
	for (i=0;i<N;i++)
	{
		min= i;
		for (j = i+1;j<N;j++)
		{
			if (a[min] > a[j])
			{
				min = j;
			}
		}
		if (min!=i)
		{
			int temp = a[i];
			a[i] = a[min];
			a[min] = temp;
		}
	}
}

int main()
{
	int a[]={9,1,5,3,2,7};
	int N = sizeof(a)/sizeof(a[0]);
	
	selectsort(a,N);
	for (int l = 0;l < N; l++)
		cout << a[l];
		cout <<endl;

	system("pause");
	return 0;
}

代碼實現2:

#include <iostream>
using namespace std;

void sort(int* a,int N)
{
	int i, j, min;
	for (i = 0; i < N; i++)
	{
		min = i;
		for (j = i + 1; j < N; j++)
		{
			if (a[j] < a[min])
			{
				min = j;
			}
		}
		if (min != i)
		{
			int temp = a[min];
			a[min] = a[i];
			a[i] = temp;
		}
	}
}

int main()
{
	int aaa[100] = { 0 };
	int N;
	cout << "N:" << endl;
	cin >> N;
	cout << "aaa[" << N << "]:" << endl;
	for (int k = 0; k < N; k++)
	{
		cin >> aaa[k];
	}
	sort(aaa, N);
	
	for (int k = 0; k < N; k++)
	{
		cout << aaa[k];
	}
	cout << endl;
	system("pause");

	return 0;
}

2.3 直接插入排序

直接插入排序的基本操作是將一個記錄插入到已經排好序的有序表中,從而得到一個新的、記錄數增1的有序表

#include <iostream>
using namespace std;

void sort(int a[],int N)
{
	int i=0; 
	int j=0;
	for (i = 1; i < N; i++)
	{
		if (a[i] < a[i - 1])
		{
			int temp = a[i];           //設置哨兵
			for (j = i - 1; a[j] > temp; j--) //若往前插入過程中,遇到a[j]<=temp;則此位置爲應該所在的位置
			{
				a[j+1] = a[j];  //記錄後移
			}
			a[j + 1] = temp;        //再將哨兵賦值給當前位置
		}
	}
}

int main()
{
	int aaa[100] = { 0 };
	int N;
	cout << "N:" << endl;
	cin >> N;
	cout << "aaa[" << N << "]:" << endl;
	for (int k = 0; k < N; k++)
	{
		cin >> aaa[k];
	}
	sort(aaa, N);
	
	for (int k = 0; k < N; k++)
	{
		cout << aaa[k];
	}
	cout << endl;
	system("pause");

	return 0;
}

2.4 希爾排序

2.5 堆排序

2.6 歸併排序

#include <iostream>
using namespace std;
void mergesort(int a[], int L, int q, int R)
{
	int n = R - L + 1;
	int* b = new int[n];
	int z = 0;
	int left = L;
	int right = q + 1;
	while(left <= q && right <= R)
		b[z++] = (a[left] <= a[right]) ? a[left++]:a[right++];
	while(left <= q)
		b[z++] = a[left++];
	while(right <= R)
		b[z++] = a[right++];
	for (int m = 0; m < n; m++)
		a[L+m] = b[m];
	delete [] b;
}
 void sort(int a[], int L, int R)
{
	if (L == R)
		return;
	int q = L + ((R - L) >> 1);
	sort(a, L, q);
	sort(a, q+1, R);
	mergesort(a, L, q, R);
}
int main()
{
	int a[6] = {5,2,1,4,9,7};
	sort(a, 0, 5);
	for (int i = 0; i < 6; i++)
		cout << a[i];
	cout << endl;
	system("pause");
	return 0;
}

2.7 快速排序

總結

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