|
|
4 years ago | |
|---|---|---|
| README.md | 4 years ago | |
README.md
sort
//1希尔排序 //时间复杂度平均:O(N^1.3) //空间复杂度:O(1) void ShellSort(int* arr, int n) { int gap = n; while (gap>1) { //每次对gap折半操作 gap = gap / 2; //单趟排序 for (int i = 0; i < n - gap; ++i) { int end = i; int tem = arr[end + gap]; while (end >= 0) { if (tem < arr[end]) { arr[end + gap] = arr[end]; end -= gap; } else { break; } } arr[end + gap] = tem; } } }
//2选择排序 //空间复杂度:O(1) //时间复杂度:最坏情况:O(N^2) 最好情况:O(N^2) void swap(int* a, int* b) { int tem = *a; *a = *b; b = tem; } void SelectSort(int arr, int n) { //保存参与单趟排序的第一个数和最后一个数的下标 int begin = 0, end = n - 1; while (begin < end) { //保存最大值的下标 int maxi = begin; //保存最小值的下标 int mini = begin; //找出最大值和最小值的下标 for (int i = begin; i <= end; ++i) { if (arr[i] < arr[mini]) { mini = i; } if (arr[i] > arr[maxi]) { maxi = i; } } //最小值放在序列开头 swap(&arr[mini], &arr[begin]); //防止最大的数在begin位置被换走 if (begin == maxi) { maxi = mini; } //最大值放在序列结尾 swap(&arr[maxi], &arr[end]); ++begin; --end; } }
// 3鸡尾酒排序 //时间复杂度: (1)顺序排列时,鸡尾酒排序时间复杂度为O(n); (2)逆序排序时,鸡尾酒排序时间复杂度为O(n^2); (3)当原始序列杂乱无序时,平均时间复杂度为O(n^2)。 //空间复杂度: 鸡尾酒排序排序过程中,Swap函数需要一个临时变量temp进行两两交换,所需要的额外空间为1,因此空间复杂度为O(1)。 ————————————————
void swap(int& a, int& b) { int tmp = a; a = b; b = tmp; }
void CockTailSort(vector &vi) { int isSorted=false; //双向同时进行 for(int i=0;i<vi.size()/2;i++) { isSorted=false; //升序排列 for(int j=i;j<vi.size()-i-1;j++) { if(vi[j]>vi[j+1]) { swap(vi[j], vi[j + 1]); isSorted=true; } }
//降序排列
for(int j=vi.size()-i-1;j>i;j--)
{
if(vi[j] < vi[j-1])
{
swap(vi[j], vi[j - 1]);
isSorted=true;
}
}
//中间排序结果输出,方便查看排序过程
for (auto x : vi)
cout << x << " ";
cout << endl;
if(isSorted==false)
{
break;
}
}
}