插入排序
- 输入一个元素,插入到一个已经排好序的数列中的适当位置,使数列依然有序。
- 思想:把欲插入的数与数组中各数逐个比较, 当找到第一个比插入数大的元素i时,该元素之前即为插入位置。然后从数组最后一个元素开始到该元素为止,逐个后移一个单元。最后把插入数赋予元素a[i]即可。如果被插入数比所有的元素值都小则插入最后位置。
#include <iostream>
using namespace std;
template<class T>
void InsertionSort(T *a, int n);
template<class T>
void InsertionSort_2(T* a, int n);
template<class T>
void Insert(const T& e, T* a, int i);
int main()
{
int x[] = { 1,3,5,7,9,2,4,6,8,0 };
double y[] = { 0,1.2,3.3,1,4.5,6 };//第一个元素不算在排序数组中
InsertionSort(x, 10);
InsertionSort_2(y, 5);
for (int i = 0; i < 10; i++)
cout << x[i] << " ";
cout << endl;
for (int i = 1; i < 5; i++)
cout << y[i] << " ";
cout << endl;
return 0;
}
template<class T>
void InsertionSort(T* a, int n) {
int in, out;
//out=0已经出去了
for (out = 1; out < n; out++) {
int temp = a[out];
in = out;
while (in > 0 && a[in - 1] >= temp) {
a[in] = a[in - 1];
--in;
}
a[in] = temp;
}
}
template<class T>
void InsertionSort_2(T* a, int n) {
//a[0]用来保存排序使用,不能保存原始数据
for (int j = 2; j < n; j++) {
T temp = a[j];
Insert(temp, a, j - 1);
/*a[0] = temp;
int i = j - 1;
while (temp < a[i]) {
a[i + 1] = a[i];
i--;
}
a[i + 1] = temp;*/
}
}
template<class T>
void Insert(const T& e, T* a, int i) {
a[0] = e;
while (e < a[i]) {
a[i + 1] = a[i];
i--;
}
a[i + 1] = e;
}
快速排序
- 速度最快,运用递归。
- 不断的选枢轴进行划分,大于枢轴的放右边,小于枢轴的放左边。
#include <iostream>
using namespace std;
template<class T>
void QuickSort(T* a, const int left, const int right) {
if (left < right) {
// 选枢轴划分
int i = left, j = right + 1;//右边加一个很大的数,始终保持不动
int pivot = a[left];
//划分过程
do {
do i++; while (a[i] < pivot);
do j--; while (a[j] > pivot);//在这里提高排序速度
if (i < j) swap(a[i], a[j]);
} while (i < j);
swap(a[left], a[j]);
//j现在为中间位置
QuickSort(a, left, j - 1);
QuickSort(a, j + 1, right);
}
}
int main() {
int a[] = { 0,2,4,6,8,1,3,5,7,9,99 };
double b[] = { 2.2,3.3,1.1,99 };
QuickSort(a, 0, 9);
QuickSort(b, 0, 2);
for (int i = 0; i <= 9; i++)
cout << a[i] << " ";
cout << endl;
for (int i = 0; i <= 2; i++)
cout << b[i] << " ";
return 0;
}
归并排序
将两个已经排序好的数组归并到一个排序好的数组里。
#include <iostream>
#include<algorithm> //copy算法的库
using namespace std;
template<class T>
void MergeSort(T* initList, T* mergeList, const int l, const int m, const int n) {
//初始数组和排序后的数组、数组下标l/m、n是数组个数
int i1, i2, iResult = 1;
for (i1 = l, i2 = m + 1; i1 <= m && i2 <= n; iResult++) {
if (initList[i1] <= initList[i2]) {
mergeList[iResult] = initList[i1];
i1++;
}
else {
mergeList[iResult] = initList[i2];
i2++;
}
}
copy(initList + i1, initList + m + 1, mergeList + iResult);
copy(initList + i2, initList + n + 1, mergeList + iResult);
}
int main() {
int a[] = { 0,23,47,81,96,7,14,39,55,62,74 };//两个已排序的数组放在一个数组里,第一个元素0不算
int b[11] = { 0 };//归并后的数组
MergeSort(a, b, 1, 4, 10);
for (int i = 1; i <= 10; i++)
cout << b[i] << " ";
cout << endl;
return 0;
}