1.冒泡排序
用了两种方式一个是双重循环,另一个是递归。我的错误是第二个递归没有设置递归出口所以一直报溢出错误。希望你们做的时候要了解。还有就是应该是可以优化这个算法,比如加一个标记,你们可以试一试博主就先不加了。
//双重循环
void bubblesort1(int* arr, int n)
{
for (int i = 0; i < n - 1; i++)//一共进行n-1排序
{
for (int j = 0; j < n - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
int p = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = p;
}
}
}
}//递归算法
void bubblesort2(int* arr, int n)
{
if (n == 0) //递归的出口
{
return;
}
for (int i = 0; i < n - 1; i++)
{
if (arr[i] > arr[i + 1])
{
int tmp = arr[i + 1];
arr[i + 1] = arr[i];
arr[i] = tmp;
}
}
bubblesort2(arr,n-1);}
int main()
{
int arr[11] = { 29,45,67,53,12,3,4,2,56,78,33 };
int n = sizeof(arr) / sizeof(arr[0]);
bubblesort2(arr, n);
for (int i = 0; i < n; i++)
{
cout << arr[i] << endl;
}
return 0;
}
2.选择排序
void SelectSort(int* a, int n)
{
for (int i = 0; i < n - 1; i++)//需要遍历的长度
{
for (int j = i + 1; j < n; j++)//每次遍历比较具体的数字
{
if (a[i] > a[j])
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
}
}
//递归方法
void SelectSort2(int* a, int n)
{
if (n < 2)return;//递归出口
for (int i = 0; i < n; i++)
{
int tmp =0;
for (int i = 0; i < n; i++)
{
if (a[i]<a[tmp])
{
tmp = i;
}
}
if (tmp != 0)
{
int tmp1 = a[tmp];
a[tmp] = a[0];
a[0] = tmp1;
}
}
SelectSort2(a + 1, n - 1);//每次传入数组后一个位置
}
int main()
{
int a[10] = { 2,3,56,76,34,23,14,16,76 };
int n = sizeof(a) / sizeof(a[0]);
cout << "排序前的数组:";
for (int i = 0; i < n-1; i++) {
cout << " " << a[i] ;
}
cout << endl;
SelectSort(a, n);
cout << "循环排序后的数组:";
for (int i = 0; i < n - 1; i++) {
cout << " " << a[i];
}
cout << endl;
SelectSort2(a, n);
cout << "递归排序后的数组:";
for (int i = 0; i < n - 1; i++) {
cout << " " << a[i];
}
return 0;
}
3.插入排序
void InsertSort(int* a, int n)
{
int i, key, j;
for (i = 1; i < n; i++)//外层循环
{
int key = a[i];
int j = i - 1;
while (j >= 0 && a[j] > key)
{
a[j + 1] = a[j];
j--;
}
a[j + 1] = key;
}
}
4.快速排序
快速排序通过多次比较与交换来完成排序。而这个过程又被分为了多次重复单趟排序,接下来我们先从每一趟的排序讲起。
快速排序的单趟排序思想是:
在一个无序数组中取一个数pivot,每一趟排序的最终目的是:让pivot的左边的所有数小于pivot,pivot的右边都大于pivot(假设排升序)。
我用的是while循环,
以下是代码:
void qsort(int a[], int L, int R)
{
if (L >= R)
return;
int left = L, right = R;
int pivot = a[left];
while (left < right)
{
while (left < right && a[right] >= pivot)//如果最右边的值大于pivot
{
right--;//向右移动
}
if (left < right)
{
a[left] = a[right];//把右边的值赋给左边
}
while (left < right && a[left] <= pivot)
{
left++;
}
if (left < right)
{
a[right] = a[left];
}
if (left >= right)
{
a[left] = pivot;
}
}
qsort(a, L, right - 1);
qsort(a, right + 1, R);
}
这个是例题:
#define _CRT_SECURE_NO_WARNINGS 1
#pragma warning(disable:6031)
#include<iostream>
using namespace std;
void qsort(int a[], int L, int R)
{
if (L >= R)
return;
int left = L, right = R;
int pivot = a[left];
while (left < right)
{
while (left < right && a[right] >= pivot)//如果最右边的值大于pivot
{
right--;//向右移动
}
if (left < right)
{
a[left] = a[right];//把右边的值赋给左边
}
while (left < right && a[left] <= pivot)
{
left++;
}
if (left < right)
{
a[right] = a[left];
}
if (left >= right)
{
a[left] = pivot;
}
}
qsort(a, L, right - 1);
qsort(a, right + 1, R);
}
int main()
{
int n, k;
cin >> n >> k;
int* a = new int[n+1];
for (int i = 0; i < n; i++)
cin >> a[i];
qsort(a, 0, n);
cout <<a[k];
return 0;
}
总结:我这个好像不太好,还需要优化.