①选择法排序
图解:
#include<stdio.h>
void select_sort(int *x, int n)
{
int i, j;
int temp;
int min;
for (i=0; i<n-1; i++)
{
min = i;//假设当前下标为i的数最小
for (j=i+1; j<n; j++)
{
if(*(x+j)<*(x+min))
{
min = j;//如果后面的数比前面的小,则记下它的下标
}
}
if (min != i)//如果min在循环中改变,就换数据
{
temp = *(x+i);
*(x+i) = *(x+min);
*(x+min) = temp;
}
}
}
int main()
{
int a[5] = {3,2,5,4,1};
int i;
bubble_sort(a, 5);
for (i=0; i<5; i++)
{
printf("%d", a[i]);
}
return 0;
}
②冒泡法排序
图解:
#include<stdio.h>
void bubble_sort(int *x, int n)
{
int i, j;
int temp;
for (i=0; i<n-1; i++)//两两比较,n个数需要比较n-1次
{
for (j=0; j<n-1-i; j++)/* n-1-i的含义每进行一次比从头到尾的比较,下一次从头到尾就少一次 */
{
if(*(x+j) > *(x+j+1))
{
temp = *(x+j+1);//如果前面的数比后面的大,就交换数据
*(x+j+1) = *(x+j);
*(x+j) = temp;
}
}
}
}
int main()
{
int a[5] = {3,2,5,4,1};
int i;
bubble_sort(a, 5);
for (i=0; i<5; i++)
{
printf("%d", a[i]);
}
return 0;
}
③直接插入法排序
图解:
#include<stdio.h>
void insert_sort(int *x, int n)
{
int i, j;
int t;
for (i=1; i<n; i++)
{
t = *(x+i);//暂存下标为i的数
j = i - 1;
while (t < *(x+j)&&j >= 0)
{
*(x+j+1) = *(x+j);//如果满足条件就往后挪
j--;//下次循环与前面排好的数进行比较
}
*(x+j+1) = t;/*在最后一次循环中由于*(x+j+1) = *(x+j)赋值导致两个数相同,故此句还原数据*/
}
}
int main()
{
int a[5] = {3,2,5,4,1};
int i;
insert_sort(a, 5);
for (i=0; i<5; i++)
{
printf("%d ", a[i]);
}
return 0;
}
快速排序:
#include <iostream>
using namespace std;
int Partition(int a[], int low, int high)
{
int i = low, j = high, pivot = a[low];
while (i < j)
{
while (i < j && a[j] > pivot)
{
j--;
}
if (i < j)
{
swap(a[i++], a[j]);
}
while (i < j && a[i] <= pivot)
{
i++;
}
if (i < j)
{
swap(a[i], a[j--]);
}
}
return i;
}
//patition也可以这样写
int Partition2(int a[], int low, int high)
{
int i = low, j = high, pivot = a[low];//基准元素
while (i < j)
{
while (i < j && a[j] > pivot)
{
j--;//向左扫描
}
while (i < j && a[i] <= pivot)
{
i++;//向右扫描
}
}
if (a[i] > pivot)
{
swap(a[i - 1], a[low]);//i已经跑到大于pivot的区间
return i - 1;
}
swap(a[i], a[low]);//i仍然在小于pivot的区间
return i;
}
void QuickSort(int a[], int low, int high)
{
int mid;
if (low < high)
{
mid = Partition(a, low, high);
QuickSort(a, low, mid - 1);
QuickSort(a, mid + 1, high);
}
}
int main()
{
int a[1000];
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
QuickSort(a, 0, n - 1);
for (int i = 0; i < n; i++)
{
cout << a[i] <<" ";
}
return 0;
}
归并排序:
#include <iostream>
using namespace std;
int a[20], b[20];
void mergesort(int L, int R)
{
if (L >= R)
{
return;
}
int mid = L + R;
mid /= 2;
mergesort(L, mid);
mergesort(mid + 1, R);
int i = L, k = L;
int j = mid + 1;
while (i <= mid && j <= R)
{
if (a[i] <= a[j])
{
b[k++] = a[i++];
}
else
{
b[k++] = a[j++];
}
}
while (i <= mid)//将imid-i和R-j两组有序序列,归并在一个有序序列中
{
b[k++] = a[i++];//将mid-i剩余的数放在最后
}
while (j <= R)
{
b[k++] = a[j++];//将r-j剩余的数放在最后
}
for(k = L;k <= R; k++)//将b数组中的数据拷贝到原数组中
{
a[k] = b[k];
}
}
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
mergesort(0, n - 1);
for (int i = 0; i < n; i++)
{
cout << a[i] << " ";
}
return 0;
}
堆排序:
#include<iostream>
using namespace std;
/*
14
99 5 36 7 22 17 46 12 2 19 25 28 1 92
*/
const int SIZE_ARRAY = 101;
int heap[SIZE_ARRAY] = {0}; // 堆中元素
int n;//堆中元素个数
//交换函数
void heapSwap(int x, int y) {
int temp = heap[x];
heap[x] = heap[y];
heap[y] = temp;
}
//向下调整函数
void siftDown(int i)
{//传入一个需要向下调整的节点编号
int t, flag = 0;//flag 标记师傅需要向下调整
//当i节点有儿子,并且需要继续调整就执行
while (i * 2 <= n && !flag)
{
//首先判断他和左儿子的关系,并用t记录较大值的节点编号
if (heap[i] < heap[i * 2])
{
t = i * 2;
}
else
{
t = i;
}
//如果有右儿子
if (i * 2 + 1 <= n)
{
if (heap[t] < heap[i * 2 + 1])
{
t = i * 2 + 1;
}
}
if (t != i)
{
heapSwap(t, i);
i = t;
}
else
{
flag = 1;
}
}
}
//建立堆的函数
void creatHeap()
{
int i;
//从最后一个非叶节点到第1个节点依次进行向上调整
for (i = n / 2; i >= 1; i--)
{
siftDown(i);
}
}
//堆排序
void heapSort()
{
while (n > 1)
{
heapSwap(1, n);
n--;
siftDown(1);
}
}
int main(void) {
int i, num;
std::cin >> num;
for (i = 1; i <= num; i++)
cin >> heap[i];
n = num;
//建堆
creatHeap();
//堆排序
heapSort();
for (i = 1; i <= num; i++)
{
cout << heap[i] << " ";
}
cout << endl;
return 0;
}
待更新。。。