0
点赞
收藏
分享

微信扫一扫

2、顶点着色器之视图矩阵

目录

一、排序总结

二、插入的排序

三、交换的排序

四、选择的排序

五、归并排序

六、基数排序

七、计数排序(空缺) 

八、排序代码 

1、插入的排序

2、交换的排序

3、选择的排序

4、归并排序

5、计数排序


一、排序总结

排序最好时间平均时间最坏时间空间复杂度
插入排序O(n)O(n*n)O(n*n)O(1)
冒泡排序O(n)O(n*n)O(n*n)O(1)
选择排序O(n*n)O(n*n)O(n*n)O(1)
希尔排序O(n^1.3)O(1)
快速排序O(n*lgn)O(n*lgn)O(n*n)O(lgn)
堆排序O(n*lgn)O(n*lgn)O(n*lgn)O(1)
归并排序O(n*lgn)O(n*lgn)O(n*lgn)O(n)
基数排序O(d(n+r))O(d(n+r))O(d(n+r))O(r)

二、插入的排序

三、交换的排序

#include <iostream>  
using namespace std;

int partition(int a[], int left, int right) {
int pivot = a[left];
while (left < right) {
while (left < right && a[right] >= pivot) right--;
a[left] = a[right];
while (left < right && a[left] <= pivot) left++;
a[right] = a[left];
}
a[left] = pivot;
return left;
}
void quickSort(int a[], int left, int right) {
if (left < right) {
int pivotIndex = partition(a, left, right);
quickSort(a, left, pivotIndex - 1);
quickSort(a, pivotIndex + 1, right);
}
}
int main() {
int a[] = {64, 34, 25, 12, 22, 11, 90};
int n = sizeof(a) / sizeof(a[0]);
quickSort(a, 0, n - 1);
for (int i = 0; i < n; i++) {
printf("%d ", a[i]);
}
printf("\n");
return 0;
}

四、选择的排序

#include <iostream>  
using namespace std;
void swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
void HeapAdjust(int a[], int n, int i) {//调整堆
int max = i;
int lchild = 2 * i + 1; // 左孩子
int rchild = 2 * i + 2; // 右孩子
if (lchild < n && a[lchild] > a[max]) max = lchild;
if (rchild < n && a[rchild] > a[max]) max = rchild;
if (max != i) {
swap(a[max], a[i]);
HeapAdjust(a, n, max);
}
}
void HeapSort(int a[], int n) {// 堆排序
for (int i = n / 2 - 1; i >= 0; i--) {
HeapAdjust(a, n, i);
}
for (int i = n - 1; i > 0; i--) {
swap(a[0], a[i]);
HeapAdjust(a, i, 0);
}
}
int main() {
int a[] = {64, 34, 25, 12, 22, 11, 90};
int n = sizeof(a) / sizeof(a[0]);
HeapSort(a, n);
for (int i = 0; i < n; i++)
cout << a[i] << " ";
return 0;
}

五、归并排序

六、基数排序

七、计数排序(空缺) 

八、排序代码 

1、插入的排序

#include <iostream>  
using namespace std;

void insertionSort(int a[], int n){
int i, j, key;
for (i = 1; i < n; i++){
key = a[i];
for (j = i - 1; j >= 0 && a[j] > key; j--){
a[j + 1] = a[j];
}
a[j + 1] = key;
}
}
int main(){
int a[] = {12, 11, 13, 5, 6};
int n = sizeof(a) / sizeof(a[0]);
insertionSort(a, n);
for (int i = 0; i < n; i++)
printf("%d ", a[i]);
return 0;
}

折半插入

#include <iostream>  
using namespace std;

void InsertSort(int a[], int n) {
int i, left, right, mid, j;
for (i = 2; i <= n; i++) {
a[0] = a[i];
left = 1;
right = i - 1;
while (left <= right){
mid = (left + right) / 2;
if (a[mid] > a[0]) right = mid - 1;
else left = mid + 1;
}
for (j = i - 1; j >= left; j--) {
a[j + 1] = a[j];
}
a[left] = a[0];
}
}
int main() {
int a[] = {4, 3, 2, 10, 12, 1, 5, 6};
int n = sizeof(a) / sizeof(a[0]);
InsertSort(a, n);
for (int i = 1; i <= n; i++) {
printf("%d ", a[i]);
}
printf("\n");
return 0;
}

希尔

#include <iostream>  
using namespace std;

void shell_sort(int a[], int n) {
int i, j, temp, d;
for (d = n / 2; d >= 1; d /= 2) {
for (i = d; i < n; i++) {
temp = a[i];
// 直接插入排序
for (j = i - d; j >= 0 && a[j] > temp; j -= d) {
a[j + d] = a[j];
}
a[j + d] = temp;
}
}
}
int main() {
int a[] = {12, 34, 54, 2, 3};
int n = sizeof(a) / sizeof(a[0]);
shell_sort(a, n);
for (int i = 0; i < n; i++) {
printf("%d ", a[i]);
}
printf("\n");
return 0;
}

2、交换的排序

冒泡

#include <iostream>  
using namespace std;

void bubbleSort(int a[], int n) {
int i, j, temp;
for (i = 0; i < n-1; i++) {
int flag = 0;
for (j = 0; j < n-1-i; j++) {
if (a[j] > a[j+1]) {
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
flag = 1;
}
}
if (flag == 0) return;
}
}
int main() {
int a[] = {64, 34, 25, 12, 22, 11, 90};
int n = sizeof(a) / sizeof(a[0]);
bubbleSort(a, n);
for (int i = 0; i < n; i++) {
printf("%d ", a[i]);
}
printf("\n");
return 0;
}

快排

#include <iostream>  
using namespace std;

int partition(int a[], int left, int right) {
int pivot = a[left];
while (left < right) {
while (left < right && a[right] >= pivot) right--;
a[left] = a[right];
while (left < right && a[left] <= pivot) left++;
a[right] = a[left];
}
a[left] = pivot;
return left;
}
void quickSort(int a[], int left, int right) {
if (left < right) {
int pivotIndex = partition(a, left, right);
quickSort(a, left, pivotIndex - 1);
quickSort(a, pivotIndex + 1, right);
}
}
int main() {
int a[] = {64, 34, 25, 12, 22, 11, 90};
int n = sizeof(a) / sizeof(a[0]);
quickSort(a, 0, n - 1);
for (int i = 0; i < n; i++) {
printf("%d ", a[i]);
}
printf("\n");
return 0;
}

3、选择的排序

选择

#include <iostream>  
using namespace std;

void swap1(int &a, int &b) {// 通过引用交换两个整数
int temp = a;
a = b;
b = temp;
}
void swap2(int *a, int *b) {// 通过指针交换两个整数
int temp = *a;
*a = *b;
*b = temp;
}
void selectSort(int a[], int n) {
int i, j, k;
for (i = 0; i < n; i++) {
k = i;
for (j = i + 1; j < n; j++) { // 找当前最小值的下标
if (a[j] < a[k]) {
k = j;
}
}
swap1(a[k],a[i]); //swap2(a[k],a[i]);
}
}
int main() {
int a[] = {64, 34, 25, 12, 22, 11, 90};
int n = sizeof(a) / sizeof(a[0]);
selectSort(a, n);
for (int i = 0; i < n; i++) {
printf("%d ", a[i]);
}
printf("\n");
return 0;
}

7、堆排序

#include <iostream>  
using namespace std;
void swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
void HeapAdjust(int a[], int n, int i) {//调整堆
int max = i;
int lchild = 2 * i + 1; // 左孩子
int rchild = 2 * i + 2; // 右孩子
if (lchild < n && a[lchild] > a[max]) max = lchild;
if (rchild < n && a[rchild] > a[max]) max = rchild;
if (max != i) {
swap(a[max], a[i]);
HeapAdjust(a, n, max);
}
}
void HeapSort(int a[], int n) {// 堆排序
for (int i = n / 2 - 1; i >= 0; i--) {
HeapAdjust(a, n, i);
}
for (int i = n - 1; i > 0; i--) {
swap(a[0], a[i]);
HeapAdjust(a, i, 0);
}
}
int main() {
int a[] = {64, 34, 25, 12, 22, 11, 90};
int n = sizeof(a) / sizeof(a[0]);
HeapSort(a, n);
for (int i = 0; i < n; i++)
cout << a[i] << " ";
return 0;
}

4、归并排序

#include <iostream>  
using namespace std;

void merge(int a[], int temp[], int left, int mid, int right) {
int i = left;
int j = mid + 1;
int k = 0;
while (i <= mid right) {
if (a[i] <= a[j]) temp[k++] = a[i++];
else temp[k++] = a[j++];
}
while (i <= mid) temp[k++] = a[i++];
while (j <= right) temp[k++] = a[j++];
for (int p = 0; p < k; p++)
a[left + p] = temp[p];
}
void mergeSort(int a[], int temp[], int left, int right) {
if (left < right) {
int mid = (left + right) / 2;
mergeSort(a, temp, left, mid);
mergeSort(a, temp, mid + 1, right);
merge(a, temp, left, mid, right);
}
}
int main() {
int a[] = {64, 34, 25, 12, 22, 11, 90};
int n = sizeof(a) / sizeof(a[0]);
int* temp = new int[n];
mergeSort(a, temp, 0, n - 1);
for (int i = 0; i < n; i++) {
cout << a[i] << " ";
}
delete[] temp;
return 0;
}

5、计数排序

举报

相关推荐

0 条评论