常见的排序算法C++
1.冒泡排序
#include<iostream>
using namespace std;
template<typename T>
void bubble_sort(T arr[], int len)
{
for (int i = 0; i < len - 1; i++)
{
for (int j = 0; j < len - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
swap(arr[j], arr[j + 1]);
}
}
}
}
int main()
{
int arr1[] = { 1,3,4,67,87,43,22,11,7,8,333 };
int len = (int)sizeof(arr1) / sizeof(*arr1);
bubble_sort(arr1, len);
for (int i = 0; i < len; i++)
{
cout << arr1[i]<<" ";
}
cout << endl;
float arr2[] = { 1.1,3.4,4.6,6.7,8.7,4.3,2.2,11.3,7.9,8.9,33.3 };
len = (float)sizeof(arr2) / sizeof(*arr2);
bubble_sort(arr2, len);
for (int i = 0; i < len; i++)
{
cout << arr2[i]<<" ";
}
cout << endl;
return 0;
}
2.选择排序
#include<iostream>
#include<vector>
using namespace std;
template<typename T>
void selection_sort(vector<T>&arr)
{
for (int i = 0; i < arr.size() - 1; i++)
{
int min = i;
for (int j = i + 1; j < arr.size(); j++)
{
if (arr[j] < arr[min])
{
min = j;
}
}
swap(arr[i], arr[min]);
}
}
int main()
{
vector<int>arr1 = { 1,3,4,67,87,43,22,11,7,8,333 };
selection_sort(arr1);
for (int i = 0; i <arr1.size(); i++)
{
cout << arr1[i]<<" ";
}
cout << endl;
vector<float>arr2 = { 1.1,3.4,4.6,6.7,8.7,4.3,2.2,11.3,7.9,8.9,33.3 };
selection_sort(arr2);
for (int i = 0; i <arr2.size(); i++)
{
cout << arr2[i] << " ";
}
cout << endl;
return 0;
}
3.插入排序
#include<iostream>
#include<vector>
using namespace std;
template<typename T>
void Insertion_sort(T arr[],int len)
{
for (int i = 1; i < len; i++)
{
T num = arr[i];
int j = i - 1;
while (j >= 0 && num < arr[j])
{
arr[j+1] = arr[j];
j--;
}
arr[j+1] = num;
}
}
int main()
{
int arr1[] = { 1,3,4,67,87,43,22,11,7,8,333 };
int len = (int)sizeof(arr1) / sizeof(*arr1);
Insertion_sort(arr1, len);
for (int i = 0; i < len; i++)
{
cout << arr1[i]<<" ";
}
cout << endl;
float arr2[] = { 1.1,3.4,4.6,6.7,8.7,4.3,2.2,11.3,7.9,8.9,33.3 };
len = (float)sizeof(arr2) / sizeof(*arr2);
Insertion_sort(arr2, len);
for (int i = 0; i < len; i++)
{
cout << arr2[i]<<" ";
}
cout << endl;
return 0;
}
4.希尔排序
#include<iostream>
#include<vector>
using namespace std;
template<typename T>
void Shell_sort(T arr[],int len)
{
int i, j, gap;
for (gap = len / 2; gap >= 1; gap /= 2)
{
//一共有gap组,每一组都要进行处理
for (int i = 0; i < gap; i++)
{
for (int j = i + gap; j < len; j += gap)
{
if (arr[j] < arr[j - gap])
{
T num = arr[j];
while (j -gap>= 0 && num < arr[j-gap])
{
arr[j] = arr[j-gap];
j = j - gap;
}
arr[j] = num;
}
}
}
}
}
int main()
{
int arr1[] = { 1,3,4,67,87,43,22,11,7,8,333 };
int len = (int)sizeof(arr1) / sizeof(*arr1);
Shell_sort(arr1, len);
for (int i = 0; i < len; i++)
{
cout << arr1[i]<<" ";
}
cout << endl;
float arr2[] = { 1.1,3.4,4.6,6.7,8.7,4.3,2.2,11.3,7.9,8.9,33.3 };
len = (float)sizeof(arr2) / sizeof(*arr2);
Shell_sort(arr2, len);
for (int i = 0; i < len; i++)
{
cout << arr2[i]<<" ";
}
cout << endl;
return 0;
}
5.归并排序
template<typename T>
void merge_sort(T arr[], int len)
{
T* a = arr;
T* b = new T[len];
for (int seg = 1; seg < len; seg += seg)
{
for (int low = 0; low < len; low += seg + seg)
{
int k = low;
int start = min(low,len);
int mid = min(low + seg, len);
int high = min(low + seg + seg, len);
int start1 = start, end1 = mid, start2 = mid, end2 = high;
while ((start1 < end1) && (start2 < end2))
{
b[k++] = a[start1] < a[start2] ? a[start1++] : a[start2++];
}
while (start1 < end1)
{
b[k++] = a[start1++];
}
while (start2 < end2)
{
b[k++] = a[start2++];
}
}
T* temp = a;
a = b;
b = temp;
}
delete[]b;
}
int main()
{
int arr1[] = { 1,3,4,67,87,43,22,11,7,8,333 };
int len = (int)sizeof(arr1) / sizeof(*arr1);
merge_sort(arr1, len);
for (int i = 0; i < len; i++)
{
cout << arr1[i]<<" ";
}
cout << endl;
float arr2[] = { 1.1,3.4,4.6,6.7,8.7,4.3,2.2,11.3,7.9,8.9,33.3 };
len = (float)sizeof(arr2) / sizeof(*arr2);
merge_sort(arr2, len);
for (int i = 0; i < len; i++)
{
cout << arr2[i]<<" ";
}
cout << endl;
return 0;
}
6.快速排序
void quickSort(int* array, int left, int right)
{
if (left < right)
{
int pivot = array[left];
int low = left, high = right;
while (low < high)
{
while (array[high] >= pivot && low < high)
high--;
array[low] = array[high];
while (array[low] <= pivot && low < high)
low++;
array[high] = array[low];
}
array[low] = pivot;
quickSort(array, left, low - 1);
quickSort(array,low + 1, right);
}
}
int main()
{
int arr1[]= { 32,33,12,31,78,45 };
int len = (int)sizeof(arr1) / sizeof(*arr1);
quickSort(arr1,0,len-1);
for (int i = 0; i < len; i++)
{
cout << arr1[i]<<" ";
}
cout << endl;
}