具体的直接去百度百科看介绍
第一种:冒泡排序
#include<bits/stdc++.h>
using namespace std;
int main(void) {
int a[10] = { 1, 5, 18, 7, 4, 2, 10, 26, 19, 77 };
/*
一般写函数的话英文为BubbleSort()
因为每一趟从头到尾的排序,都会把一个最大的放在最后,所以需要n-1躺
*/
for (int i = 0; i < 9; i++) {//一共需要来回九躺
for (int j = 0; j < 9 - i; j++) {//因为每一次结束,后面已经定下位置的就不需要继续参与比较了
if (a[j] > a[j + 1]) {
int t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
for (int i = 0; i < 9; i++)
printf("%d ", a[i]);
printf("%d\n", a[9]);
return 0;
}
二:选择排序
#include<bits/stdc++.h>
using namespace std;
int main(void) {
int a[10] = { 1, 5, 18, 7, 4, 2, 10, 26, 19, 77 };
/*
一般写函数的话英文为SelectSort()
因为每一趟要找出一个最小的排在前面
*/
int index;//index用来找到第i+1小的数的下标
for (int i = 0; i < 10; i++) {
index = i;
for (int j = i + 1; j < 10; j++) {
if (a[j] < a[index]) {
index = j;
}
}
int t = a[index];
a[index] = a[i];
a[i] = t;
}
for (int i = 0; i < 9; i++)
printf("%d ", a[i]);
printf("%d\n", a[9]);
return 0;
}
三:插入排序
#include<bits/stdc++.h>
using namespace std;
int main(void) {
int a[10] = { 1, 5, 18, 7, 4, 2, 10, 26, 19, 77 };
/*
一般写函数的话英文为InsertSort()
首先规定第一个是已经排过顺序的,从第二个开始依次插入已排过顺序的序列中
*/
for (int i = 1; i < 10; i++) {//默认第一个数,也就是a[i]已经是排完顺序的
int InsertValue = a[i];//插入的数据
int InsertIndex = i - 1;//插入的坐标,即在i-1处插入
//InsertIndex <0 说明在已经排过序的数据中,没有比插入的数更小的
//而且在比较的过程中,若该位置的数据比插入的数据大,那么该位置的数据就往后移动一位
while (InsertIndex >= 0 && InsertValue < a[InsertIndex]) {
a[InsertIndex + 1] = a[InsertIndex];
InsertIndex--;
}
a[InsertIndex + 1] = InsertValue;
}
for (int i = 0; i < 9; i++)
printf("%d ", a[i]);
printf("%d\n", a[9]);
return 0;
}
四:希尔排序
#include<bits/stdc++.h>
using namespace std;
int main(void) {
int a[10] = { 1, 5, 18, 7, 4, 2, 10, 26, 19, 77 };
/*
一般写函数的话英文为ShellSort()
先分组,然后对每组元素都进行插入排序,
分组按照长度/2
*/
int len = 10;
for (int gap = len / 2; gap > 0; gap /= 2) {
//对数组元素分组
for (int i = gap; i < len; i++) {
//遍历各组元素
for (int j = i - gap; j >= 0; j -= gap) {
if (a[j] > a[j + gap]) {
int t = a[j];
a[j] = a[j + gap];
a[j + gap] = t;
}
}
}
}
for (int i = 0; i < 9; i++)
printf("%d ", a[i]);
printf("%d\n", a[9]);
return 0;
}
五:快速排序:
#include<bits/stdc++.h>
using namespace std;
int a[10] = { 1, 5, 18, 7, 4, 2, 10, 26, 19, 77 };
void QuickSort(int left, int right);
int main(void) {
/*
一般写函数的话英文为QuickSort()
*/
QuickSort(0, 9);
for (int i = 0; i < 9; i++)
printf("%d ", a[i]);
printf("%d\n", a[9]);
return 0;
}
void QuickSort(int left, int right) {
int i, j, t;
if (left >= right)
return;
int temp = a[left];//temp就是基准数
i = left;
j = right;
while (i != j) {
while (a[j] >= temp && i < j)
j--;
while (a[i] <= temp && i < j)
i++;
if (i < j) {
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
//将基准数归位
a[left] = a[i];
a[i] = temp;
QuickSort(left, i - 1);
QuickSort(i + 1, right);
}
六:归并排序
#include<bits/stdc++.h>
using namespace std;
int n;
int a[20] = { 0 };
int b[20];
void GetData();
void MergeSort(int *a, int left, int right, int *b);
void Merge(int *a, int left, int right, int mid, int *b);
void PrintData();
int main(void) {
scanf("%d", &n);
GetData();
MergeSort(a, 0, n - 1, b);
PrintData();
return 0;
}
void GetData() {
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);
}
void MergeSort(int *a, int left, int right, int *b) {
if (left < right) {
int mid = (left + right) / 2;//中间索引
MergeSort(a, left, mid, b);
MergeSort(a, mid + 1, right, b);
Merge(a, left, right, mid, b);
}
}
void Merge(int *a, int left, int right, int mid, int *b) {
int i = left;//左边有序序列的初始索引
int j = mid + 1;//右边有序序列的初始索引
int t = 0;//指向b数组的当前索引,
//先把左右两边(有序数据)按规则填到b数组中
//直到左右两边的有序序列,有一边处理完成为止
while (i <= mid && j <= right) {
//如果左边有序当前元素小于或等于右边有序当前元素
//那么就把左边的元素填到b数组中
if (a[i] < a[j]) {
b[t++] = a[i++];
}
else {
b[t++] = a[j++];
}
}
while (i <= mid) {
//此时说明左边序列还有剩余元素,全部填到b数组中
b[t++] = a[i++];
}
while (j <= right) {
b[t++] = a[j++];
}
//将b数组内容复制到a数组内容
t = 0;
int _left = left;
while (_left <= right) {
a[_left++] = b[t++];
}
}
void PrintData() {
int i;
for (i = 0; i < n - 1; i++)
printf("%d ", a[i]);
printf("%d\n", a[i]);
}