快排和冒泡高质量排序

一、快速排序

(1)排列整数:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int com_int(const void *elem1, const void *elem2 )
{
return *(int *)elem1 - *(int *)elem2;
}
int main()
{
int arr[] = { 1, 3, 5, 7, 2, 4, 6, 8 };
int i = 0;
qsort(arr,
sizeof(arr) / sizeof(arr[0]),
sizeof(arr[0]), com_int);
for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
printf("%d ", arr[i]);
}
printf("\n");
system("pause");
return 0;
}

运行结果:

1 2 3 4 5 6 7 8

(2)排列多个字符串:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int com_str(const void *elem1, const void *elem2)
{
return strcmp((char *)*(int *)elem1, 
(char *)*(int *)elem2);
}
int main()
{
char *arr[] = {"bbbb","aaaa","dddd","cccc"};
int i = 0;
qsort(arr,
sizeof(arr) / sizeof(arr[0]),
sizeof(arr[0]), com_str);
for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
printf("%s ", arr[i]);
}
printf("\n");
system("pause");
return 0;
}

运行结果:

aaaa bbbb cccc dddd

二、冒泡排字符串

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void bubble_sort(char*str[], int sz)
{
int i = 0;
int j = 0;
for (i = 0; i < sz - 1; i++)
{
for (j = 0; j < sz - 1 - i; j++)
{
if (strcmp(str[j], str[j + 1])>0)
{
char*tmp = NULL;
tmp = str[j];
str[j] = str[j + 1];
str[j + 1] = tmp;
}
}
}
}
int main()
{
char*str[] = { "hello", "world", "to", "bit", "welcome" };//指针数组
int i = 0;
bubble_sort(str, sizeof(str) / sizeof(str[0]));
for (i = 0; i < sizeof(str) / sizeof(str[0]); i++)
{
printf("%s ", str[i]);
}
printf("\n");
system("pause");
return 0;
}

结果:

bit hello to welcome world

优化冒泡(高质量):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int com_str(const void *elem1, const void *elem2)
{
return strcmp((char *)*(int *)elem1, 
(char *)*(int *)elem2);
}
 
void Swap(char *p1, char *p2, size_t sz)
{
size_t i = 0;
for(i = 0; i<sz; i++)
{
char tmp = *(p1+i);
*(p1+i) = *(p2+i);
*(p2+i) = tmp;
}
}
 
void bubble_sort(void *base, size_t num, size_t width,
int (*cmp)(const void *elem1, const void *elem2))
{
size_t  i = 0;
size_t  j = 0;
for(i = 0; i < num-1; i++)
{
for(j = 0; j < num-1-i; j++)
{
if(cmp((char *)base+ width*j, 
(char *)base+width*(j+1)) > 0)
{
Swap((char *)base+ width*j, (char *)base+width*(j+1), width);
}
}
}
}
 
int main()
{
char *arr[] = {"bbbb","aaaa","dddd","cccc"};
int i = 0;
bubble_sort(arr,
sizeof(arr)/sizeof(arr[0]),
sizeof(arr[0]), com_str);
for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
printf("%s ", arr[i]);
}
printf("\n");
system("pause");
return 0;
}
时间: 2024-10-14 11:55:22

快排和冒泡高质量排序的相关文章

单链表的排序(快排和冒泡实现)以及查找中间结点

//快排,冒泡链表排序 #include<iostream> #include<assert.h> using namespace std; template<class T> struct LinkNode { T _data; LinkNode* _next; LinkNode(const T& x) :_data(x) , _next(NULL) {} }; template<class T> class ListNode { //为了安全性

Java排序算法分析与实现:快排、冒泡排序、选择排序、插入排序、归并排序(二)

一.概述: 上篇博客介绍了常见简单算法:冒泡排序.选择排序和插入排序.本文介绍高级排序算法:快速排序和归并排序.在开始介绍算法之前,首先介绍高级算法所需要的基础知识:划分.递归,并顺带介绍二分查找算法. 二.划分: 划分是快速排序的前提,即把数据分为两组,大于特定值的数据在一组,小于特定值的数据在另一组.快速排序即是由划分和递归操作来完成的. (1)原理: 定义一个阈值,分别从最左面和最右面向中间遍历元素,左面找到一个大于阈值的数据便停止,右边找到一个小于阈值的数据便停止,如果此时左右两边都还没

快排,冒泡排,选择排序,希尔排序

package cn.hncu.dataStruct; public class SortMethods { /* 算法好坏的评价指标(一般只在n值非常大的时候才会考虑,如n取10万): * 1.时间复杂度: 通俗点,就是指程序运行的快慢(时间)---通常用计算机的运算(算术,赋值)次数来代替 * 2.空间复杂度: 占用内存空间的大小---通常用程序中使用了多少变量(栈内存.堆内存),这些变量总共占了多少内存 */ public static void main(String[] args) {

排序-冒泡,归并,快排区别

快排: #include <iostream> #include <string.h> #include <stdio.h> #include <cmath> using namespace std; void Q_Sort(int a[],int low,int high) { if(low >= high) return; int first = low; int last = high; int key = a[first]; while(fir

普林斯顿大学算法课 Algorithm Part I Week 3 重复元素排序 - 三路快排 Duplicate Keys

很多时候排序是为了对数据进行归类,这种排序重复值特别多 通过年龄统计人口 删除邮件列表里的重复邮件 通过大学对求职者进行排序 若使用普通的快排对重复数据进行排序,会造成N^2复杂度,但是归并排序和三路快排就没有这样的问题. 归并排序对重复数据排序的比较在1/2NlgN和NlgN之间 三路快排 目标:将数据分成三个区间(3-way partitioning) lt和gt区间内的元素都和比较元素v相等 lt左边的元素都比v小 gt右边的元素都比v大 性能 三路快排的复杂度比普通快排小,主要取决于数据

排序之快排

排序是将一串数据按照其某个或者某些关键字的大小进行递增或递减排列的操作我,通常指的排序是升序,排序方式是原地排序 下面介绍下快速排序,简称快排 快排 原理: 从待排序区间选择一个数,作为基准值(pivot) Partition: 遍历整个待排序区间,将比基准值小的(可以包含相等的)放到基准值的左边,将比基准值大的(可以包含相等的)放到基准值的右边 采用分治思想,对左右两个小区间按照同样的方式处理,直到小区间的长度等于1,代表已经有序,或者小区间的长度等于0,代表没有数据. 快排是一个不稳定的排序

Coursera 数据结构 清华 邓俊辉 第十二章 漫谈快排

引言 ? ? 本文从多个方面讲解了快速排序的知识点,包括快排分而治之的思想,以及他与归并排序注重点的不同,快排的性能,包括最优最差以及平均性能,并以均匀分布为例,证明了快排的平均性能是1.39*(n+1)logn,接下来又从熵的角度说明了一下快排为什么下界只能达到nlogn,为什么堆排比快排慢,而基排又能够逃脱nlogn的界限,因为nlogn只针对基于比较的排序算法 ? ? 快排的思想 ? ? 快排采取分而治之的思想,将待排序的序列分为两个子序列S分为SL和SR两个子序列,这个思想跟归并排序有点

快速排序--QuickSort,看完五分彩开奖网平台搭建自己就能写出来的快排思路推演

快速五分彩开奖网平台搭建论坛:haozbbs.com Q1446595067排序(QuickSort)介绍首先发明者竟然敢给自己发明的算法叫做QuickSort,这个名字闪不闪亮?好比别的武功叫做六脉神剑.降龙十八掌,我这个叫做"天下无敌神功".别的排序算法都是按照特点来起的,你这个不是应该叫分块递归排序法吗?或者和希尔一样,叫做霍尔排序也可以啊,这么高调是要干啥啊?我给了他一次机会,特意去查了一下,这个名字并不是江湖朋友抬爱给的,就是发明者自己起的,社会社会...不过看完这篇博客,理

普林斯顿公开课 算法3-3:三路快排

很多时候排序是为了对数据进行归类,比如对城市进行排序,对员工的职业进行排序.这种排序的特点就是重复的值特别多. 如果使用普通的快排对这些数据进行排序,会造成N^2复杂度,但是归并排序和三路快排就没有这样的问题. 三路快排 三路快排的基本思想就是,在对数据进行分区的时候分成左中右三个部分,中间都是相同的值,左侧小于中间,右侧大于中间. 性能 三路快排的复杂度比普通快排小,主要取决于数据中重复数据的数量.重复数据越多,三路快排的复杂度就越接近于N. 代码 public class Quick3 {