选择排序的核心思想是什么?
选择排序和冒泡排序的区别在哪里?
代码实现
// 选择排序
#include<iostream>
using namespace std;
const int N = 1e5+10000;
void selectionsort(int a[], int l ,int r)
{
int max = 0;
for(int i = r; i >= l; i--)
{
max = 0;
for(int j = l; j <= i; j++)
{
if(a[j]>a[max])max = j;
}
swap(a[max],a[i]);
}
}
int main()
{
int n, a[N];
scanf("%d", &n);
for(int i = 0; i < n; i++)scanf("%d", &a[i]);
selectionsort(a, 0, n-1);
for(int i = 0; i < n; i++)printf("%d ", a[i]);
return 0;
}
冒泡排序的核心思想是什么?
代码实现
// 冒泡排序
#include<iostream>
using namespace std;
const int N = 1e5+10000;
void bubblesort(int a[], int l ,int r)
{
for(int i = r; i >= l; i--)
{
for(int j = l; j < i; j++)
{
if(a[j]>a[j+1])swap(a[j],a[j+1]);
}
}
}
int main()
{
int n, a[N];
scanf("%d", &n);
for(int i = 0; i < n; i++)scanf("%d", &a[i]);
bubblesort(a, 0, n-1);
for(int i = 0; i < n; i++)printf("%d ", a[i]);
return 0;
}
插入排序的核心思想是什么?
插入排序和选择排序的区别?
插入排序是不断从无序数列中挑选元素插入到有序数列使其仍然构成有序数列
选择排序是依靠位置顺序每次选择最值使其成为有序数列
插入排序是局部冒泡,交换次数变多,但是和数据相关
时间复杂度都是
O ( 1 ) + O ( 2 ) + . . . + O ( n ? 1 ) = O ( n 2 ) O(1)+O(2)+...+O(n-1) = O(n^2) O(1)+O(2)+...+O(n?1)=O(n2)
代码实现
// 插入排序
#include<iostream>
using namespace std;
const int N = 1e5+10000;
void insertionsort(int a[], int l ,int r)
{
for(int i = l; i <= r; i++)
{
for(int j = i; j > l; j--)
{
if(a[j]<a[j-1])swap(a[j],a[j-1]);
}
}
}
int main()
{
int n, a[N];
scanf("%d", &n);
for(int i = 0; i < n; i++)scanf("%d", &a[i]);
insertionsort(a, 0, n-1);
for(int i = 0; i < n; i++)printf("%d ", a[i]);
return 0;
}
希尔排序的核心思想是什么?
希尔排序和插入排序的区别?
插入排序对于无序的效率更高
希尔排序对于相对有序的数据效率更高,时间复杂度接近于O(n)
总的来说两者时间复杂度都是
O ( 1 ) + O ( 2 ) + . . . + O ( n ? 1 ) = O ( n 2 ) O(1)+O(2)+...+O(n-1) = O(n^2) O(1)+O(2)+...+O(n?1)=O(n2)
代码实现
// 希尔排序
#include<iostream>
using namespace std;
const int N = 1e5+10000;
void shellsort(int a[], int l ,int r)
{
int len = r-l+1;
for(int gap = len>>1; gap > 0; gap >>= 1)
{
for(int i = gap; i < len; i++)
{
for (int j = i - gap; j >= 0; j -= gap)
{
if(a[j]>a[j+gap])swap(a[j],a[j+gap]);
}
}
}
}
int main()
{
int n, a[N];
scanf("%d", &n);
for(int i = 0; i < n; i++)scanf("%d", &a[i]);
shellsort(a, 0, n-1);
for(int i = 0; i < n; i++)printf("%d ", a[i]);
return 0;
}
如何运用快速排序算法思想将问题进行分解?
如何确定快速排序的基线条件?
快速排序在什么时候会退化到O(n2)
快速排序示例
#include<iostream>
using namespace std;
const int N = 1e5+10;
int n;
long long a[N];
void quick_sort(long long a[], int l, int r)
{
if (l >= r) return;
int i = l - 1, j = r + 1, x = a[l + r >> 1];
while (i < j)
{
do i ++ ; while (a[i] < x);
do j -- ; while (a[j] > x);
if (i < j) swap(a[i], a[j]);
}
quick_sort(a, l, j), quick_sort(a, j + 1, r);
}
int main(){
scanf("%d", &n);
for(int i = 0; i < n; i++)scanf("%d", &a[i]);
quick_sort(a, 0, n-1);
for(int i = 0; i < n; i++)printf("%lld ", a[i]);
return 0;
}
快速排序时间复杂度
!O(n*logn)
如何运用归并排序算法思想将问题进行分解
如何确定归并排序的基线条件
归并排序和快速排序的区别和联系
归并排序示例
#include<iostream>
using namespace std;
//#define N 1e5+10
const int N = 1e5+10000;
int tmp[N];
void merge(int a[], int l, int mid, int r)
{
int i = l, j = mid + 1, k = 0;
while(i <= mid && j <=r)a[i] > a[j] ? tmp[k++] = a[j++] : tmp[k++] = a[i++];
while(i <= mid)tmp[k++] = a[i++];
while(j <= r)tmp[k++] = a[j++];
for(i = l, j = 0; i <= r; i++, j++)a[i] = tmp[j];
}
void mergesort(int a[],int l, int r)
{
if(l >= r) return;
int mid = l + r >> 1;
mergesort(a, l, mid);
mergesort(a, mid+1, r);
merge(a, l, mid, r);
}
int main()
{
int n, a[N];
scanf("%d", &n);
for(int i = 0; i < n; i++)scanf("%d", &a[i]);
mergesort(a, 0, n-1);
for(int i = 0; i < n; i++)printf("%d ", a[i]);
return 0;
}
归并排序实践复杂度分析
!O(n*logn)