排序详解
冒泡排序
于是我们的代码就有了
void BubbleSort(int* a, int n) {
for (int i = 0; i < n - 1; i++) {
int exchange=0;
for (int j = 0; j < n - 1 - i; j++) {
if (a[j] > a[j + 1]) {
int tmp = a[j];
a[j] = a[j + 1];
a[j + 1] = tmp;
exchange=1;
}
}
if(exchange==1){
break;
}
}
}
插入排序
然后我们的代码就有了
void InsertSort(int* a, int n) {
for (int i = 1; i < n; i++) {
int tmp = a[i];
int end = i - 1;
while (end >= 0) {
if (a[end] > tmp) {
a[end + 1] = a[end];
}
else {
break;
}
end--;
}
a[end + 1] = tmp;
}
}
希尔排序
void ShellSort(int* a, int n)
{
int gap = n;
while (gap > 1)
{
//gap = gap / 2;
gap = gap / 3 + 1;
for (int i = 0; i < n - gap; ++i)
{
int end = i;
int tmp = a[end + gap];
while (end >= 0)
{
if (tmp < a[end])
{
a[end + gap] = a[end];
end -= gap;
}
else
{
break;
}
}
a[end + gap] = tmp;
}
}
}
选择排序
void SelectSort(int* a, int n) {
for (int i = 0; i < n - 1; i++) {
int mini = i;
for (int j = i + 1; j < n; j++) {
if (a[j] < a[mini]) {
mini = j;
}
}
Swap(&a[i], &a[mini]);
}
}
void SelectSort(int* a, int n) {
int start = 0;
int end = n - 1;
while (start < end) {
int maxi = start;
int mini = start;
for (int i = start + 1; i <= end; i++) {
if (a[i] > a[maxi]) {
maxi = i;
}
if (a[i] < a[mini]) {
mini = i;
}
}
Swap(&a[start], &a[mini]);
if (start == maxi) {
maxi = mini;
}
Swap(&a[end], &a[maxi]);
start++;
end--;
}
}
快速排序
void QuickSort1(int* a, int begin, int end) {
if (begin >= end) {
return;
}
int keyi = begin;
int left = begin;
int right = end;
while (left < right) {
while (a[right] >= a[keyi] && left < right) {
right--;
}
while (a[left] <= a[keyi] && left<right) {
left++;
}
Swap(&a[left], &a[right]);
}
Swap(&a[keyi], &a[left]);
QuickSort1(a, begin, left - 1);
QuickSort1(a, left + 1, end);
}
void QuickSort2(int* a, int begin, int end) {
if (begin >= end) {
return;
}
int tmp = a[begin];
int pit = begin;
int left = begin;
int right = end;
while (left<right) {
while (left < right && tmp <= a[right]) {
right--;
}
Swap(&a[pit], &a[right]);
pit = right;
while (left < right && tmp >= a[left]) {
left++;
}
Swap(&a[pit], &a[left]);
pit = left;
}
a[pit] = tmp;
QuickSort2(a, begin, pit - 1);
QuickSort2(a, pit + 1, end);
}
归并排序
void _MergeSort(int* a, int* tmp, int begin, int end) {
if (end <= begin) {
return;
}
int mid = (end + begin) / 2;
_MergeSort(a, tmp, begin, mid);
_MergeSort(a, tmp, mid+1 , end);
int cur = begin;
int x1 = begin;
int x2 = mid;
int x3 = mid+ 1;
int x4 = end;
while (x1 <= x2 && x3 <= x4) {
if (a[x1] < a[x3]) {
tmp[cur++] = a[x1++];
}
else {
tmp[cur++] = a[x3++];
}
}
while (x1 <= x2) {
tmp[cur++] = a[x1++];
}
while (x3 <= x4) {
tmp[cur++] = a[x3++];
}
memcpy(a+begin, tmp+begin, sizeof(int) * (end - begin + 1));
}
void MergeSort(int* a, int n) {
int* tmp = (int*)malloc(sizeof(int) * n);
if (tmp == NULL) {
perror("malloc fail");
exit(-1);
}
_MergeSort(a, tmp, 0, n - 1);
free(tmp);
}
排序确实是数据结构这门课中非常重要的一环,鉴于我是初学者,对各个排序的理解还是不够深彻,只能先潦草的把这篇博客写完,等我以后理解的更加深彻之后,我肯定会回来完善这篇博客的,话不多说,我先发布了