六种基本排序...包括冒泡排序,直接插入排序,直接选择排序,希尔排序,归并排序,快速排序. 第七种堆排序目前理解的不是很好,未完成.
运行时间方便比较排序时间效率,N可以改变数组元素个数方便测试,随机数用来生成随机数组.
C++实现如下:
// arraySort.cpp : 数组排序
//
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
const int N = 100; //数组元素个数
const int RAND = 1000; //随机数范围
void sortMP(int a[], int n); //冒泡排序
void sortZC(int a[], int n); //直接插入排序
void sortZX(int a[], int n); //直接选择排序
void sortShell(int a[], int n); //希尔排序
void sortKP(int a[], int l, int r); //快速排序
void sortD(int a[], int n); //堆排序(暂未完成)
void sortG(int a[], int low, int mid, int high, int temp[]);//归并排序(合并)
void sortMerge(int a[], int low, int high, int temp[]);//归并排序(递归) 主函数调用
void printarray(int a[],int n); //打印数组
int main()
{
int a[N];
srand((int)time(NULL)); //每次执行种子不同,生成不同的随机数
for (int i = 0; i < N; i++)
{
a[i] = rand() % RAND;
}
clock_t start_time = clock();
sortMP(a, N);
//sortZC(a, N);
//sortZX(a, N);
//sortShell(a, N);
// 归并排序
/*
int *p = new int[N];
sortMerge(a, 0,N-1,p);
cout<<"归并排序结果: ";
printarray(a, N);
*/
// 快速排序
/*
sortKP(a,0,N-1);
cout << "快速排序结果: ";
printarray(a, N);
*/
//sortD(a, N); 暂未完成
clock_t end_time = clock();
cout << "运行时间: " << static_cast<double>(end_time - start_time) / CLOCKS_PER_SEC * 1000 << "ms" << endl;
system("pause");
return 0;
}
void sortMP(int a[], int n)//冒泡排序
{
for (int i = 0; i < n; i++)
{
for (int j = 1; j < n - i; j++)
if (a[j - 1] < a[j]) //从大到小
swap(a[j - 1], a[j]);
}
cout << "冒泡1排序结果: ";
printarray(a, n);
int flag = n;
while (flag > 0)
{
int k = flag;
flag = 0;
for (int j = 1; j < k; j++)//从小到大
{
swap(a[j - 1], a[j]);
flag = j;
}
}
cout << "冒泡2排序结果: ";
printarray(a, n);
}
void sortZC(int a[], int n)//直接插入排序
{
for (int i = 1; i < n; i++)
{
int j = 0;
if (a[i] < a[i - 1])
{
int temp = a[i];
for (j = i - 1; j >= 0 && a[j] > temp; j--)
a[j + 1] = a[j];
a[j + 1] = temp;
}
}
cout << "直接插入结果: ";
printarray(a, n);
}
void sortZX(int a[], int n) //直接选择排序
{
int min;
for (int i = 0; i < n; i++)
{
min = i;
for(int j=i+1;j<n;j++)
if (a[j] < a[min])
{
min = j;
}
swap(a[i], a[min]);
}
cout << "直接选择结果: ";
printarray(a, n);
}
void sortShell(int a[], int n)//希尔排序
{
/****** 本块方便理解
int gap;
for (gap = n / 2; gap > 0; gap /= 2)
for (int i = 0; i < gap; i++)
{
for (int j = i + gap; j < n; j += gap)
{
if (a[j] < a[j - gap])
{
int temp = a[j];
int k = j - gap;
while (k >= 0 && a[k] > temp)
{
a[k + gap] = a[k];
k -= gap;
}
a[k + gap] = temp;
}
}
}*/
int gap; //此块分排序部分为冒泡思想
for(gap =n/2;gap>0;gap/=2)
for(int i=gap;i<n;i++)
for (int j = i - gap; j >= 0 && a[j] > a[j + gap]; j -= gap)
{
swap(a[j], a[j + gap]);
}
cout << "希尔排序结果: ";
printarray(a, n);
}
void sortG(int a[], int low, int mid, int high, int temp[])//归并排序(合并)
{
int i, j, k;
i = low;
j = mid + 1;//避免重复比较a[mid]
k = 0;
while (i <= mid && j <= high)
{
if (a[i] <= a[j])
temp[k++] = a[i++];
else
temp[k++] = a[j++];
}
while (i <= mid)
temp[k++] = a[i++];
while (j <= high) //a[low,mid]已经全部归入temp数组,(mid,high]还有剩余
temp[k++] = a[j++];
for (i = 0; i < k; i++)
a[low + i] = temp[i]; //应从a[low+i]开始赋值
}
void sortMerge(int a[], int low, int high, int temp[])//归并排序(递归) 主函数调用
{
if (low < high)
{
int mid = (low + high) / 2;
sortMerge(a, low, mid, temp); //左边有序
sortMerge(a, mid + 1, high, temp); //右边有序
sortG(a, low, mid, high, temp); //合并
}
}
void sortKP(int a[], int l, int r) //快速排序
{
if (l < r)
{
int i = l, j = r, x = a[l];
while (i < j)
{
while (i < j&&a[j] >= x)
j--;
if (i < j)
a[i++] = a[j];
while (i < j&&a[i] < x)
i++;
if (i < j)
a[j--] = a[i];
}
a[i] = x;
sortKP(a, l, i - 1); //左
sortKP(a, i + 1, r); //右
}
}
void sortD(int a[], int n) //堆排序(未完成)
{
}
void printarray(int a[],int n) //打印函数
{
for (int i = 0; i < n; i++)
cout << a[i] << " ";
cout << endl;
}