排序算法分为五大类,一共是有九种,如下:
插入类:直接插入排序、折半插入排序、希尔排序
交换类:冒泡排序、快速排序
选择类:简单选择排序、堆排序
归并类:二路归并排序
基数类:多关键字排序
九种算法的时间复杂度、空间复杂度和稳定性小结如下:
本文放出插入算法的三种排序算法代码。
八种常用的排序算法代码可以到这里下载。
直接插入排序
void InsertSort(int R[], int n) {
if (R == NULL || n <= 0)
return;
int i, j, temp;
cout<<"直接插入排序:"<<endl;
for (i = 1; i < n; ++i) {
temp = R[i];
j = i - 1;
while (j >= 0 && temp < R[j]) {
R[j + 1] = R[j];
--j;
}
R[j + 1] = temp;
for (int k = 0; k < n; k++)
cout << R[k] << " ";
cout << endl;
}
cout << endl;
}
折半插入排序
void binaryInsertSort(int R[], int n) {
if (R == NULL || n <= 0)
return;
int i, j, mid, low, high, temp;
cout <<endl<< "折半插入排序:" << endl;
for (i = 1; i < n; i++) {
low = 0;
high = i - 1;
temp = R[i];
while (low <= high) {
mid = (low + high) / 2;
if (R[mid] > temp) {
high = mid - 1;
}
else {
low = mid + 1;
}
}
for (j = i - 1; j >= high + 1; j--)
R[j + 1] = R[j];
R[high+1] = temp;
for (int k = 0; k < n; k++)
cout << R[k] << " ";
cout << endl;
}
cout << endl;
}
希尔排序
void shellSort(int R[], int n){
if (R == NULL || n <= 0)
return;
cout << endl << "希尔排序:" << endl;
int len = n;
while (len > 1)
{
len = len / 3 + 1;
for (int i = len; i < n; i++)
{
int temp = R[i];
if (R[i] < R[i - len])
{
int j;
for (j = i - len; j >= 0 && R[j] > temp; j = j - len)
R[j + len] = R[j];
R[j +len] = temp;
}
}
for (int k = 0; k < n; k++)
cout << R[k] << " ";
cout << endl;
}
cout << endl;
}
总体
#include <iostream>
using namespace std;
void InsertSort(int R[], int n) {
if (R == NULL || n <= 0)
return;
int i, j, temp;
cout<<"直接插入排序:"<<endl;
for (i = 1; i < n; ++i) {
temp = R[i];
j = i - 1;
while (j >= 0 && temp < R[j]) {
R[j + 1] = R[j];
--j;
}
R[j + 1] = temp;
for (int k = 0; k < n; k++)
cout << R[k] << " ";
cout << endl;
}
cout << endl;
}
void binaryInsertSort(int R[], int n) {
if (R == NULL || n <= 0)
return;
int i, j, mid, low, high, temp;
cout <<endl<< "折半插入排序:" << endl;
for (i = 1; i < n; i++) {
low = 0;
high = i - 1;
temp = R[i];
while (low <= high) {
mid = (low + high) / 2;
if (R[mid] > temp) {
high = mid - 1;
}
else {
low = mid + 1;
}
}
for (j = i - 1; j >= high + 1; j--)
R[j + 1] = R[j];
R[high+1] = temp;
for (int k = 0; k < n; k++)
cout << R[k] << " ";
cout << endl;
}
cout << endl;
}
void shellSort(int R[], int n){
if (R == NULL || n <= 0)
return;
cout << endl << "希尔排序:" << endl;
int len = n;
while (len > 1)
{
len = len / 3 + 1;
for (int i = len; i < n; i++)
{
int temp = R[i];
if (R[i] < R[i - len])
{
int j;
for (j = i - len; j >= 0 && R[j] > temp; j = j - len)
R[j + len] = R[j];
R[j +len] = temp;
}
}
for (int k = 0; k < n; k++)
cout << R[k] << " ";
cout << endl;
}
cout << endl;
}
int main()
{
int A[8] = { 49,38,65,97,76,13,27,49 };
int n = 8;
int R[8];
cout << "原始数组:" << endl;
for (int k = 0; k < n; k++) {
R[k] = A[k];
cout << R[k] << " ";
}
cout<< endl << endl;
InsertSort(R, n); //直接插入排序
for (int k = 0; k < n; k++) {
R[k] = A[k];
cout << R[k] << " ";
}
cout << endl;
binaryInsertSort(R, n); //折半插入排序
for (int k = 0; k < n; k++) {
R[k] = A[k];
cout << R[k] << " ";
}
cout << endl;
shellSort(R, n); //希尔排序
return 0;
}
主要参考的书籍是《数据结构高分笔记》2021版