Python及C++中的排序
一、Python中的排序
(一)内置排序函数sorted()
基本用法
sorted()
函数可以对所有可迭代对象进行排序操作,返回一个新的列表,原列表不会被修改。例如,对于一个简单的数字列表nums = [3, 1, 4, 1, 5, 9, 2, 6]
,使用sorted(nums)
后会得到[1, 1, 2, 3, 4, 5, 6, 9]
。 对于字符串列表,如words = ["apple", "banana", "cherry", "date"]
,sorted(words)
会按照字母顺序排序,得到['apple', 'banana', 'cherry', 'date']
。 关键字参数
key参数
可以通过key
参数指定一个函数,该函数会在排序时被调用,用于提取比较的键。 比如,如果有一个包含数字和字母的列表mixed_list = ['a', 'c', 'b', 1, 3, 2]
,我们想要按照字符的ASCII值进行排序,可以使用sorted(mixed_list, key=str)
。因为str
函数会将数字转换为字符串,然后按照字符串的ASCII值排序,结果是[1, 2, 3, 'a', 'b', 'c']
。 对于更复杂的数据结构,如一个包含学生信息的列表students = [{'name': 'Alice', 'age': 23}, {'name': 'Bob', 'age': 20}, {'name': 'Charlie', 'age': 22}]
,如果按照年龄排序,可以使用sorted(students, key=lambda x: x['age'])
,得到[{'name': 'Bob', 'age': 20}, {'name': 'Charlie', 'age': 22}, {'name': 'Alice', 'age': 23}]
。 reverse参数
用于指定排序顺序,默认为False
,表示升序排序。如果设置为True
,则为降序排序。 例如,sorted(nums, reverse=True)
会将数字列表nums
降序排序为[9, 6, 5, 4, 3, 2, 1, 1]
。
(二)列表的sort()方法
基本用法
sort()
方法是列表对象的一个方法,它会直接对原列表进行排序,不返回新的列表。对于列表nums = [3, 1, 4, 1, 5, 9, 2, 6]
,调用nums.sort()
后,nums
就变成了[1, 1, 2, 3, 4, 5, 6, 9]
。 关键字参数
它也支持key
和reverse
参数,用法和sorted()
函数类似。例如,nums.sort(key=lambda x: -x)
会按照数字的相反数进行排序,即降序排序。
二、C++中的排序
(一)标准库函数sort()
头文件
在C++中,要使用sort()
函数,需要包含头文件<algorithm>
。 基本用法
sort()
函数的原型是void sort(RandomAccessIterator first, RandomAccessIterator last)
,其中first
和last
分别是迭代器,表示要排序的范围。例如,对于一个数组int arr[] = {3, 1, 4, 1, 5, 9, 2, 6};
,可以使用sort(arr, arr + 8);
来对整个数组进行升序排序。 对于std::vector<int> vec = {3, 1, 4, 1, 5, 9, 2, 6};
,可以使用sort(vec.begin(), vec.end());
来对vector
容器中的元素进行排序。 自定义比较函数
可以通过提供第三个参数来自定义排序规则。这个参数是一个比较函数,它接收两个参数,返回一个布尔值。 比如,要对一个结构体数组按照某个成员进行排序,假设有一个结构体struct Person { std::string name; int age; };
和一个数组Person people[] = {{"Alice", 23}, {"Bob", 20}, {"Charlie", 22}};
,如果按照年龄升序排序,可以这样写:bool compareAge ( const Person & a, const Person & b) {
return a. age < b. age;
}
sort ( people, people + 3 , compareAge) ;
也可以使用C++11的lambda表达式来简化比较函数的定义,例如sort(vec.begin(), vec.end(), [](int a, int b) { return a > b; });
可以对vector
中的整数进行降序排序。
(二)stable_sort()
稳定性
stable_sort()
和sort()
类似,但它是一个稳定排序算法。稳定排序算法是指当两个元素相等时,它们在排序后的序列中的相对位置保持不变。例如,对于一个包含重复元素的数组int arr[] = {3, 1, 4, 1, 5, 9, 2, 6};
,使用sort(arr, arr + 8);
和stable_sort(arr, arr + 8);
都会得到[1, 1, 2, 3, 4, 5, 6, 9]
。但如果数组中有对象,且对象的比较键相同,但其他属性不同,stable_sort()
会保持这些对象的原始相对顺序。 用法
它的用法和sort()
类似,也可以接受自定义比较函数。例如,对于一个std::vector<Person>
,如果按照名字的字典序进行稳定排序,可以这样写:stable_sort ( vec. begin ( ) , vec. end ( ) , [ ] ( const Person & a, const Person & b) {
return a. name < b. name;
} ) ;
三、Python和C++排序的性能比较
Python排序
Python的sorted()
和sort()
方法底层实现是Timsort算法,它是一种混合排序算法,结合了归并排序和插入排序的优点。对于大多数情况,其时间复杂度为O(nlogn),在实际应用中表现很高效。 C++排序
C++的sort()
函数通常实现为快速排序、归并排序或堆排序的混合体,具体实现可能因标准库的实现而异。它的平均时间复杂度也是O(nlogn),但在最坏情况下(如快速排序的输入为已经有序的数组),可能会退化到O(n^2)。不过,现代C++标准库通常会优化这种情况。 stable_sort()
通常基于归并排序,保证了稳定性,时间复杂度为O(nlogn)。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2333997.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!