交换排序之冒泡排序和快速排序
温馨提示:
本文最后更新于 2021年11月22日,已超过 1,124 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我。
冒泡排序和快速排序都是通过两两关键字之间进行比较大小然后进行交换位置来进行的
所以这里放在一起来学习
之前博客里有写过,需要详细的可以在博客里搜索一下
这里直接上代码了
#include <stdio.h>
#define N 20
/**
*打印数组
*/
void PrintArrary(char desc[],int a[],int len){
puts(desc);
for(int i = 0;i<len;i++){
printf("%d ",a[i]);
}
printf("\n");
}
void swap(int a[],int i,int j){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
/**
*冒泡排序
*两两比较每次选择一个最大的元素放到最后
*/
void bubbleSort(int a[],int len){
int temp;
for(int i=len-1;i>0;i--){ //冒泡的趟数 len-1 次
for(int j=0;j<i;j++) {
if(a[j]>a[j+1]) { //这里需要注意的是j+1要小于 待排序的长度
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
}
void bubbleSort1(int a[],int len){
for(int i = 0;i < len-1;i++){ //冒泡的趟数 len-1 次 每循环一次就排序完成一个元素
int flag = 0;
for(int j = 0;j<len-i-1;j++){ //这里需要注意的是j+1要小于 待排序的长度
flag = 1;
if(a[j]>a[j+1]){
swap(a,j,j+1);
}
}
if(flag == 0)
return ; //本轮没有进行交换--》已经有序了直接结束
}
}
int partition(int a[],int low,int high){
int i = low,j = high,pivot = a[i];
while(i < j){
while(i<j&&a[j]>=pivot ) j--;
a[i] = a[j];
while(i<j&&a[i]<=pivot ) i++;
a[j] = a[i];
}
a[i] = pivot;
return i;
}
/**
*快速排序
*每次选择一个元素为枢纽 将序列划分为两部分 一部分比枢纽大;一部分比枢纽小
*
*/
void quickSort(int a[],int low,int high) {
if(low < high){
int p = partition(a,low,high);
quickSort(a,low,p-1);
quickSort(a,p+1,high);
}
}
int main() {
int a[N] = {4,3,8,9,6,7,2,1};
int len = 8;
PrintArrary("初始序列",a,len);
bubbleSort1(a,len);
PrintArrary("冒泡排序",a,len);
quickSort(a,0,len-1);
PrintArrary("快速排序",a,len);
return 0;
}
正文到此结束
- 本文标签: 排序 数据结构
- 本文链接: https://www.it1997.com/article/55
- 版权声明: 本文由小陈没烦恼原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权