插入、选择、冒泡、快排、shell、merge排序(可运行)

来源:互联网 发布:美国实时经济数据 编辑:程序博客网 时间:2024/06/07 08:22

#include<iostream>
#include<stdlib.h>
#include<algorithm>
#include<vector>
using namespace std;
void insert(int A[100])    //插入排序 
{
for (int i = 0; i <= 99; i++)
{
for (int j = i; j >0; j--)
{
if (A[j] < A[j - 1])
{
int temp = A[j];
A[j] = A[j - 1];
A[j - 1] = temp;
}
}
}
}
void insertGood(int A[100])//优化的插入排序 
{
for (int i = 0;i <= 99;i++)
{
int j = i;
int head = 0;
int tail = i;
while (1)
{
if (A[j]<A[(head + tail) / 2])
{
head = (head + tail) / 2 + 1;
}
if (A[j] >= A[(head + tail) / 2])
{
tail = (head + tail) / 2;
}
if (head == tail)
{
int temp = A[j];
int a = j;
while (tail - 1<a)
{
A[a] = A[a - 1];
a--;
}
A[head] = temp;
break;
}
}
}
}
void bubble(int A[100])
{
for (int i = 0;i<99;i++)
{
for (int j = 0;j<99 - i;j++)
{
if (A[j]>A[j + 1])
{
int temp = A[j];
A[j] = A[j + 1];
A[j + 1] = temp;
}
}
}
}
void select(int A[100])
{
for (int j = 0;j <= 99;j++)
{
int maxindex = 0;
for (int i = 0;i <= 99 - j;i++)
{
if (A[i]>A[maxindex])
{
maxindex = i;
}
}
int temp = A[99 - j];
A[99 - j] = A[maxindex];
A[maxindex] = temp;
}
}
void insert2(int A[], int n, int curr)//为希尔排序编写的选择排序 
{
for (int i = curr;i<n;i += curr)
{
for (int j = i;j >= curr;j -= curr)
{
if (A[j]<A[j - curr])
{
int temp = A[j];
A[j] = A[j - curr];
A[j - curr] = temp;
}
}
}
}
void shell(int A[100], int n)//希尔排序。若数组不为2的倍数,则应该补齐 (未实现) 
{
for (int i = n / 2;i>2;i /= 2)
{
for (int j = 0;j<i;j++)
{
insert2(&A[j], n - j, i);
}
}
insert2(A, n, 1);
}
void mergesort(int A[], int temp[], int left, int right)//归并排序 
{
if (left == right)return;
int mid = (right + left) / 2;
mergesort(A, temp, left, mid);
mergesort(A, temp, mid + 1, right);
for (int i = left;i <= right;i++)
{
temp[i] = A[i];
}
int i1 = left;
int i2 = mid + 1;
for (int curr = left;curr <= right;curr++)
{
if (i1 == mid + 1)
{
A[curr] = temp[i2++];
}
else if (i2>right)
{
A[curr] = temp[i1++];
}
else if (temp[i1]<temp[i2])
{
A[curr] = temp[i1++];
}
else
{
A[curr] = temp[i2++];
}
}
}
void mergeGood(int A[], int temp[], int left, int right)//优化的归并排序 
{
if (right - left <= 8)//使用插入排序排小的数组 
{
insert2(&A[left], right - left + 1, 1);
return;
}
int i, j, k, mid = (left + right) / 2;
mergeGood(A, temp, left, mid);
mergeGood(A, temp, mid + 1, right);
for (i = mid;i >= left;i--)         //消除if语句,并没有提高效率 
{
temp[i] = A[i];
}
for (j = 1;j <= right - mid;j++)
{
temp[right - j + 1] = A[j + mid];
}
for (i = left, j = right, k = left;k <= right;k++)
{
if (temp[i]<temp[j])
{
A[k] = temp[i++];
}
else
{
A[k] = temp[j--];
}
}
}
int partition(int A[], int l, int r, int& pivot)//为快排做的函数 
{
do
{
while (A[++l]>pivot);
while (A[--r]<pivot&&l<r);
int temp = A[l];
A[l] = A[r];
A[r] = temp;
} while (l<r);
return l;
}
void Quicksort(int A[], int i, int j)//快速排序 
{
if (j <= i)return;
int pivotindex = (i + j) / 2;
int temp1 = A[j];
A[j] = A[pivotindex];
A[pivotindex] = temp1;
int k = partition(A, i - 1, j, A[j]);
temp1 = A[j];
A[j] = A[k];
A[k] = temp1;
Quicksort(A, i, k - 1);
Quicksort(A, k + 1, j);
}
bool cmp(int a, int b) //为了堆排序建的比较函数
{
return a<b;
}
void heap(int A[], int B[])
{
vector<int> H(100);
for (int i = 0;i <= 99;i++)
{
H[i] = A[i];
}
make_heap(H.begin(), H.end(), cmp);
for (int i = 0;i <= 99;i++)
{
B[i] = H[0];
pop_heap(H.begin(), H.end());
H.pop_back();
make_heap(H.begin(), H.end(), cmp);
}




}
void radix(int A[], int B[], int k, int r, int cnt[])
{
int j;
for (int i = 0, rtoi = 1;i < k;i++, rtoi *= r)
{
for (j = 0;j < r;j++)
{
cnt[j] = 0;
}
for (j = 0;j < 100;j++)
{
cnt[(A[j] / rtoi) % r]++;
}
for (j = 1;j < r;j++)
{
cnt[j] = cnt[j - 1] + cnt[j];
}
for (j = 99;j >= 0;j--)
{
B[--cnt[(A[j] / rtoi) % r]] = A[j];
}
for (j = 0;j < 100;j++)
{
A[j] = B[j];
}
}
}
int main()
{
srand(1);
int i = 0;
int temp[100];
int sortArray[100];
int cnt[10];
while (i <100)
{
sortArray[i] = rand() % 10000;
i++;
}
i--;
heap(sortArray, temp);
while (i >= 0)
{
cout << temp[i] << " ";
i--;
}
system("pause");
return 0;
}

阅读全文
1 0