排序
1、冒泡排序
#include <iostream>
#include<cmath>
using namespace std;
void Bubble(int a[], int n)
{
for (int i = 0; i < n;i++)
for (int j = i; j < n; j++)
{
if (a[i]>a[j]) //从小到大
swap(a[i], a[j]);
}
}
int main()
{
int n;
int b[80] = { 0 };
cin >> n;
for (int i = 0; i < n; i++)
cin >> b[i];
Bubble(b, n);
for (int i = 0; i < n; i++)
cout<< b[i]<<" ";
return 0;
}
2、选择排序
选择排序是一种简单的排序方法,它的基本思想是:
第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,
第二次从R[1]~R[n-1]中选取最小值,与R[1]交换,
….,
第i次从R[i-1]~R[n-1]中选取最小值,与R[i-1]交换,
…..,
第n-1次从R[n-2]~R[n-1]中选取最小值,与R[n-2]交换,
共通过n-1次,得到一个从小到大排列的有序序列。
void Select(int a[], int n)
{
for (int i = 0; i < n; i++)
{
int min = i;
for (int j = i+1; j < n; j++)
{
if (a[min] > a[j])
min = j;
}
swap(a[min], a[i]);
}
}
3、插入排序
void Insert(int a[], int n)
{
for (int i = 1; i < n; i++)
{
for (int j = i-1; j >=0 && a[j]>a[j+1]; j--)
{
swap(a[j], a[j+1]);
}
}
}
4、快速排序
void Quick(int a[], int left, int right)
{
if (left < right)
{
int low = left;
int high = right;
int key = a[left];
while (low < high)
{
while (low < high && a[high] >= key)
{
high--;
}
a[low] = a[high];
while (low < high && a[low] <= key)
{
low++;
}
a[high] = a[low];
} //小while结束
a[low] = key;
Quick(a, left, low - 1);
Quick(a, low + 1, right);
}
else
return;
}
5、归并排序
#include <iostream>
using namespace std;
int a[] = { 23, 65, 12, 3, 8, 76, 345, 90, 21, 75, 34, 61 };
int len = sizeof(a) / sizeof(a[0]);
int * c = new int[len];
void mergeArray(int * a, int * c, int left, int middle, int right)
{
int i = left;
int j = middle;
int m = middle + 1;
int n = right;
int k = 0;
while (i <= j && m <= n)
{
if (a[i] <= a[m])
c[k++] = a[i++];
else
c[k++] = a[m++];
}
while (i <= j)
c[k++] = a[i++];
while (m <= n)
c[k++] = a[m++];
for (i = 0; i < k; i++)
a[left + i] = c[i];
}
void merge(int * a, int * c, int left, int right)
{
if (left < right)
{
int middle = (left + right) / 2;
merge(a, c, left, middle);
merge(a, c, middle + 1, right);
mergeArray(a, c, left, middle, right);
}
}
int main()
{
merge(a, c, 0, len - 1);
for (int i = 0; i < len; i++)
cout << a[i] << " ";
system("pause");
return 0;
}
6、堆排序
// 建立大根堆
void buildHeap(int *A, int n)
{
for(int i = n / 2; i >= 1; --i)
{
adjustHeap(A, i, n);
}
}
// 调整堆
void adjustHeap(int *A, int idx, int n)
{
int ldx = 2 * idx + 1;
int rdx = 2 * idx + 2;
int maxdx = idx;
if(idx <= n / 2)
{
if(ldx < n && A[ldx] > A[maxdx])
{
maxdx = ldx;
}
if(rdx < n && A[rdx] > A[maxdx])
{
maxdx = rdx;
}
if(maxdx != idx)
{
swap(A + idx, A + maxdx);
adjustHeap(A, maxdx, n);
}
}
}
// 堆排序
int* heapSort(int* A, int n) {
buildHeap(A, n);
for(int i = n - 1; i > -1; --i)
{
swap(A, A + i);
adjustHeap(A, 0, i);
}
return A;
}
浙公网安备 33010602011771号