c语⾔sort_C语⾔⼗⼤经典排序算法(动态演⽰+代码,值得收
藏)
以前也零零碎碎发过⼀些排序算法,但排版都不太好,⼜重新整理⼀次,排序算法是数据结构的重要部分,系统地学习很有必要。
时间、空间复杂度⽐较
排序算法平均时间复杂度最差时间复杂度空间复杂度数据对象稳定性
冒泡排序O(n2)O(n2)O(1)稳定
选择排序O(n2)O(n2)O(1)数组不稳定、链表稳定
插⼊排序O(n2)O(n2)O(1)稳定
快速排序O(n*log2n)O(n2)O(log2n)不稳定
堆排序O(n*log2n)O(n*log2n)O(1)不稳定
归并排序O(n*log2n)O(n*log2n)O(n)稳定
希尔排序O(n*log2n)O(n2)O(1)不稳定
计数排序O(n+m)O(n+m)O(n+m)稳定
桶排序O(n)O(n)O(m)稳定
基数排序O(k*n)O(n2)稳定
1 冒泡排序
算法思想:
1. ⽐较相邻的元素。如果第⼀个⽐第⼆个⼤,就交换他们两个。
2. 对每⼀对相邻元素作同样的⼯作,从开始第⼀对到结尾的最后⼀对。这步做完后,最后的元素会是最⼤的数。
3. 针对所有的元素重复以上的步骤,除了最后⼀个。
4. 持续每次对越来越少的元素重复上⾯的步骤,直到没有任何⼀对数字需要⽐较。
冒泡排序动图演⽰
代码:
void bubbleSort(int a[], int n)
{
for(int i =0 ; i< n-1; ++i)
{
for(int j = 0; j < n-i-1; ++j)
{
if(a[j] > a[j+1])
{
int tmp = a[j] ; //交换
a[j] = a[j+1] ;
a[j+1] = tmp;
}
}
}
}
2 选择排序
算法思想:
1. 在未排序序列中到最⼩(⼤)元素,存放到排序序列的起始位置
2. 从剩余未排序元素中继续寻最⼩(⼤)元素,然后放到已排序序列的末尾
3. 以此类推,直到所有元素均排序完毕
选择排序动图演⽰
代码:
function selectionSort(arr) {
var len = arr.length;
var minIndex, temp;
for (var i = 0; i < len - 1; i++) {
minIndex = i;
for (var j = i + 1; j < len; j++) {
if (arr[j] < arr[minIndex]) { // 寻最⼩的数
minIndex = j; // 将最⼩数的索引保存
}
电脑program是什么}
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
return arr;
}
3 插⼊排序
算法思想:
1. 从第⼀个元素开始,该元素可以认为已经被排序
2. 取出下⼀个元素,在已经排序的元素序列中从后向前扫描
simulink元件对照表
3. 如果该元素(已排序)⼤于新元素,将该元素移到下⼀位置
4. 重复步骤3,直到到已排序的元素⼩于或者等于新元素的位置
5. 将新元素插⼊到该位置后
6. 重复步骤2~5
插⼊排序动图演⽰
代码:
void print(int a[], int n ,int i){
cout< for(int j= 0; j<8; j++){
cout< }
cout<}
void InsertSort(int a[], int n)
{
for(int i= 1; i if(a[i] < a[i-1]){ //若第i个元素⼤于i-1元素,直接插⼊。⼩于的话,移动有序表后插⼊ int j= i-1;
int x = a[i]; //复制为哨兵,即存储待排序元素
a[i] = a[i-1]; //先后移⼀个元素钠是大量元素还是微量元素
while(x < a[j]){ //查在有序表的插⼊位置
a[j+1] = a[j];
j--; //元素后移
}
a[j+1] = x; //插⼊到正确位置
}
print(a,n,i); //打印每趟排序的结果
}
}
int main(){
int a[15] = {2,3,4,5,15,19,16,27,36,38,44,46,47,48,50};
InsertSort(a,15);
print(a,15,15);
}
4 快速排序
算法思想:
1. 选取第⼀个数为基准
2. 将⽐基准⼩的数交换到前⾯,⽐基准⼤的数交换到后⾯
3. 对左右区间重复第⼆步,直到各区间只有⼀个数
快速排序动图演⽰
代码:
冒泡排序代码c语言void QuickSort(vector& v, int low, int high) {
if (low >= high) // 结束标志
return;
int first = low; // 低位下标
int last = high; // ⾼位下标
int key = v[first]; // 设第⼀个为基准
while (first < last)
c++复制构造函数的作用{
// 将⽐第⼀个⼩的移到前⾯
while (first < last && v[last] >= key)
last--;
if (first < last)
v[first++] = v[last];
// 将⽐第⼀个⼤的移到后⾯
while (first < last && v[first] <= key)
first++;
if (first < last)
v[last--] = v[first];
}
//
v[first] = key;
python神经网络编程pdf// 前半递归
QuickSort(v, low, first - 1);
// 后半递归
QuickSort(v, first + 1, high);
}
5 堆排序
堆排序(Heapsort)是指利⽤堆这种数据结构所设计的⼀种排序算法。堆积是⼀个近似完全⼆叉树的结构,并同时满⾜堆积的性质:即⼦结点的键值或索引总是⼩于(或者⼤于)它的⽗节点。
算法思想:
1. 将初始待排序关键字序列(R1,R2….Rn)构建成⼤顶堆,此堆为初始的⽆序区;
2. 将堆顶元素R[1]与最后⼀个元素R[n]交换,此时得到新的⽆序区(R1,R2,……Rn-1)和新的有序区(Rn),且满⾜R[1,2…n-1]<=R[n];
3. 由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前⽆序区(R1,R2,……Rn-1)调整为新堆,然后再次将R[1]与⽆序区最后
⼀个元素交换,得到新的⽆序区(R1,R2….Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。
代码:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论