各类排序算法汇总
问题描述
排序问题作为算法的入门内容,我们接触的很多算法或者数据结构的相关书籍总是花费对排序算法进行详细讲解,我在最近看一些算法的时候将看到的排序算法都进行了实现,贴出来与大家交流,同时也算是自己对这几种算法的一个小结。
C++代码如下
//插入排序
void Insertion_sort(vector<int> nums){
int key;
int j;
for (int i = 1; i < nums.size(); i++){
key = nums[i];
j = i - 1;
while ((j>= 0)&&nums[j]<key){
nums[j + 1] = nums[j];
j -= 1;
}
nums[j + 1] = key;
}
for (int k = 0; k < nums.size(); k++)
cout << nums[k]<<endl;
}
void Binary_adding(vector<int> nums1, vector<int> nums2){
vector<int> nums3(nums1.size() + 1,0);
int flag =0;
for (int i = nums1.size()-1; i >= 0; i--)
{
nums3[i+1] = nums1[i] + nums2[i] + flag;
if (nums3[i+1] >= 2)
flag = 1;
else
flag = 0;
nums3[i+1] %= 2;
}
nums3[0] = flag;
for (int i = 0; i < nums1.size(); i++)
{
cout << nums1[i]<<" ";
}
cout << endl;
for (int i = 0; i < nums1.size(); i++)
{
cout << nums2[i]<<" ";
}
cout << endl;
for (int i = 0; i < nums3.size(); i++)
{
cout << nums3[i] << " ";
}
}
//查找排序
void search_sort(vector<int> nums){
int j;
int min;
int tmp = 0, order=0;
for (int i = 0; i < nums.size(); i++){
for (j = i,min = nums[i]; j < nums.size(); j++){
if ((j - 1 >= i)&&(nums[j - 1] > nums[j]))
{
min = nums[j];
order = j;
}
}
if (nums[i] != min){
tmp = nums[i];
nums[i] = min;
nums[order] = tmp;
}
cout << nums[i] << endl;
}
}
//归并排序,这个借鉴了网上某位大神的博客内容
void merge(int *data, int p, int q, int r)
{
int n1, n2, i, j, k;
int *left = NULL, *right = NULL;
n1 = q - p + 1;
n2 = r - q;
left = (int *)malloc(sizeof(int)*(n1));
right = (int *)malloc(sizeof(int)*(n2));
for (i = 0; i<n1; i++) //对左数组赋值
left[i] = data[p + i];
for (j = 0; j<n2; j++) //对右数组赋值
right[j] = data[q + 1 + j];
i = j = 0;
k = p;
while (i<n1 && j<n2) //将数组元素值两两比较,并合并到data数组
{
if (left[i] <= right[j])
data[k++] = left[i++];
else
data[k++] = right[j++];
}
for (; i<n1; i++) //如果左数组有元素剩余,则将剩余元素合并到data数组
data[k++] = left[i];
for (; j<n2; j++) //如果右数组有元素剩余,则将剩余元素合并到data数组
data[k++] = right[j];
}
void mergeSort(int *data, int p, int r)
{
int q;
if (p < r) //只有一个或无记录时不须排序
{
q = (int)((p + r) / 2); //将data数组分成两半
mergeSort(data, p, q); //递归拆分左数组
mergeSort(data, q + 1, r); //递归拆分右数组
merge(data, p, q, r); //合并数组
}
}
//计数排序,这种排序以空间换时间,时间复杂度为Θ(k+n)
void counting_sort(vector<int> A,int max_value)
{
vector<int> C(max_value+1,0);
vector<int> B(A.size()+1, 0);
vector<int> D(max_value+1, 0);
A.push_back(A[0]);
for (int i = 1; i < A.size() ; i++)
C[A[i]]++;
for (int i = 1; i < C.size(); i++)
D[i] =D[i-1]+ C[i];
for (int i = 1; i < A.size(); i++)
{
B[D[A[i]]] = A[i];
D[A[i]]--;
}
for (int i = 1; i < B.size(); i++)
cout << B[i] << endl;
}
总结
由于代码是在同一个文件中反复修改实现的,所以没有贴出来完整的代码,只是给出了算法实现的函数。