因为是在准备考研的复试上机,没有太多的时间整理出完善的知识点。因此,这里只给出每种排序算法的具体实现,如有不周到的地方,请见谅,谢谢!
一、冒泡排序算法
#include <iostream>
using namespace std;
//冒泡排序算法
void bubbleSort(int num[], int n) {
for (int i = 0; i < n - 1; i++) { //外层循环,只需要比较n-1次
bool flag = false; //标志位,判断本轮循环是否交换过
for (int j = 0; j < n - i - 1; j++) { //两两进行比较
if (num[j] > num[j + 1]) { //如果前一个元素大于后面一个元素
flag = true; //标志位修改为true
int temp = num[j + 1]; //交换两个元素
num[j + 1] = num[j];
num[j] = temp;
}
}
if (flag == false) { //如果本来没有交换过,就表示数列已经有序
break; //直接结束循环
}
}
}
int main() {
int num[] = { 9,8,7,6,5,4,3,2,1,0 }; //定义初始状态的数组
bubbleSort(num, 10); //调用冒泡排序
cout << "排序后的数组:"; //打印排序后的数组
for (int i = 0; i < 10; i++) {
cout << num[i]<<" ";
}
}
二、双向冒泡排序算法
这个是对冒泡排序的一些优化,但是时间复杂度上面没有改变(目标院校的往年上机题中出现过,所以这里也记录一下)
#include <iostream>
using namespace std;
void bidBubbleSort(int num[], int n) {
for (int i = 0; i < n-1; i++) { //外层循环,只需要n-1次
bool flag = false; //标志位,用来记录本轮排序是否进行了交换
for (int j = 0; j < n - i - 1; j++) { //从左至右进行排序
if (num[j] > num[j + 1]) { //如果前一个大于后一个
flag = true; //修改标志位
int temp = num[j]; //进行交换
num[j] = num[j + 1];
num[j + 1] = temp;
}
}
for (int j = n - i - 2; j > 0; j--) { //从右至左进行排序
if (num[j] < num[j - 1]) { //如果后一个小于前一个
flag = true; //修改标志位
int temp = num[j - 1]; //进行交换
num[j - 1] = num[j];
num[j] = temp;
}
}
if (flag == false) { //如果本轮没有修改过,表示数列已经有序
break; //直接结束循环
}
}
}
int main() {
int num[] = { 9,8,7,6,5,4,3,2,1,0 }; //定义初始状态的数组
bidBubbleSort(num, 10); //调用双向冒泡排序
cout << "排序后的数组:"; //打印排序后的数组
for (int i = 0; i < 10; i++) {
cout << num[i]<<" ";
}
}
三、选择排序
#include <iostream>
using namespace std;
//选择排序
void selectSort(int num[], int n) {
for (int i = 0; i < n - 1; i++) { //外层循环,只需要n-1次
int min = i; //初始化min,标记本轮循环中最小元素位置
for (int j = i + 1; j < n; j++) { //内层循环,从i+1位置开始
if (num[j] < num[min]) { //如果当前位置元素小于num[min]
min = j; //修改min的值
}
}
if (min != i) { //如果min不是最初的值
int temp = num[i]; //进行交换
num[i] = num[min];
num[min] = temp;
}
}
}
int main() {
int num[] = { 9,8,7,6,5,4,3,2,1,0 }; //定义初始状态的数组
selectSort(num, 10); //调用选择排序
cout << "排序后的数组:"; //打印排序后的数组
for (int i = 0; i < 10; i++) {
cout << num[i]<<" ";
}
}
四、插入排序
#include <iostream>
using namespace std;
//选择排序
void insertSort(int num[],int n){
for (int i = 1; i < n; i++) { //外层循环,从第二个元素开始
int temp = num[i]; //记录下来第i个元素
int j;
for (j = i - 1; j >= 0; j--) { //从第i-1个元素开始向前
if (num[j] > temp) { //如果第j个元素大于temp
num[j + 1] = num[j]; //则j位置元素向后移动到j+1
}
else {
break; //找到temp要插入位置,直接结束里层循环
}
}
num[j + 1] = temp; //temp插入指定位置
}
}
int main() {
int num[] = { 9,8,7,6,5,4,3,2,1,0 }; //定义初始状态的数组
insertSort(num, 10); //调用选择排序
cout << "排序后的数组:"; //打印排序后的数组
for (int i = 0; i < 10; i++) {
cout << num[i]<<" ";
}
}
五、希尔排序
#include <iostream>
using namespace std;
//希尔排序
void shellSort(int num[], int n) {
for (int gap = n / 2; gap > 0; gap /= 2 ) { //设定每轮循环的间隙gap
for (int i = gap; i < n; i++) { //从第gap开始向后比较
int temp = num[i]; //记录下第i个元素的值
int j;
for (j = i - gap; j >= 0; j -= gap) { //进行跳跃式插入排序
if (num[j] > temp) { //如果num[j]大于temp
num[j + gap] = num[j]; //则num[j]向后移动gap个位置
}
else { //否则已经找到temp要插入的位置
//注意:这个break必须有,保证查找到temp要插入的位置时立马跳出循环,不会继续执行
break; //直接结束内层循环
}
}
num[j + gap] = temp; //将temp插入到指定位置
}
}
}
int main() {
int num[] = { 9,8,7,6,5,4,3,2,1,0 }; //定义初始状态的数组
shellSort(num, 10); //调用希尔排序
cout << "排序后的数组:"; //打印排序后的数组
for (int i = 0; i < 10; i++) {
cout << num[i]<<" ";
}
}
六、归并排序
#include <iostream>
using namespace std;
void Merge(int arr[], int low, int mid, int high) {
//i指向第一有序区的第一个元素,j指向第二有序区的第一个元素
int i = low, j = mid + 1, k = 0;
int* temp = new int[high - low + 1]; //创建一个临时数组来作为中转
while (i <= mid && j <= high) { //边界条件
if (arr[i] <= arr[j]) { //如果第一有序区的元素小于第二有序区
temp[k++] = arr[i++]; //将第一有序区元素放入中转数组
}
else {
temp[k++] = arr[j++]; //否则,第二有序区元素放入中转数组
}
}
while (i <= mid) {
temp[k++] = arr[i++]; //将剩余元素加入中转数组
}
while (j <= high) {
temp[k++] = arr[j++]; //将剩余元素加入中转数组
}
for (int i = low, k = 0; i <= high; i++, k++) {
arr[i] = temp[k]; //从中转数组中转移回原数组
}
delete[]temp; //释放空间
}
void MergeSort(int arr[], int low, int high) {
if (low >= high) {
return; //如果只有一个元素,直接返回
}
int mid = (low + high) / 2; //取中点
MergeSort(arr, low, mid); //对第一个区域进行排序
MergeSort(arr, mid + 1, high); //对第二个区域进行排序
Merge(arr, low, mid, high); //合并两个区域
}
int main() {
int num[] = { 9,8,2,7,4,5,3,6,1,0 }; //定义初始状态的数组
MergeSort(num, 0,9); //调用归并排序
cout << "排序后的数组:"; //打印排序后的数组
for (int i = 0; i < 10; i++) {
cout << num[i]<<" ";
}
}
七、快速排序
#include <iostream>
using namespace std;
void quickSort(int arr[],int left, int right)
{
if (left >= right) //如果只剩下一个元素
return; //直接返回
int i, j, base, temp;
i = left, j = right; //初始化 i=左端点 j=右端点
base = arr[left]; //base用来存放基准值
while (i < j) //边界条件
{
while (arr[j] >= base && i < j) //当右边元素大于基准值,则不动
j--;
while (arr[i] <= base && i < j) //当左边元素小于基准值,则不动
i++;
if (i < j)
{
temp = arr[i]; //交换左右
arr[i] = arr[j];
arr[j] = temp;
}
}
arr[left] = arr[i];
arr[i] = base; //将基准值存放到i位置
quickSort(arr, left, i - 1); //递归左边
quickSort(arr, i + 1, right); //递归右边
}
int main() {
int num[] = { 9,8,2,7,4,5,3,6,1,0 }; //定义初始状态的数组
quickSort(num, 0, 9); //调用快速排序
cout << "排序后的数组:"; //打印排序后的数组
for (int i = 0; i < 10; i++) {
cout << num[i]<<" ";
}
}