十大排序
作者:互联网
十大排序
冒泡排序
#include<stdio.h>
void bubble_sort(int arr[],int len){
int i,j,temp;
for(i=0;i<len-1;i++){
for(j=0;j<len-1-i;j++){
if(arr[j]>arr[j+1]){
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}
int main(){
int arr[]={22,34,3,32,82,89,50,37,5,64,35,9,70};
int len=(int)sizeof(arr)/sizeof(*arr);
bubble_sort(arr,len);
int i;
for(i=0;i<len;i++){
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
选择排序
选最小的放在最前面
#include<stdio.h>
void swap(int *a,int *b){
int temp;
temp=*a,
*a=*b;
*b=temp;
}
void select_sort(int arr[],int len){
int i,j;
for(i=0;i<len-1;i++){
int min=i;
for(j=i+1;j<len;j++)
if(arr[j]<arr[min]){
min=j;
swap(&arr[min],&arr[i]);
}
}
}
int main(){
int arr[]={22,34,3,32,82,89,50,37,5,64,35,9,70};
int len=(int)sizeof(arr)/sizeof(*arr);
select_sort(arr,len);
int i;
for(i=0;i<len;i++){
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
插入排序
插入到已经排好序的之中
#include<stdio.h>
void insertion_sort(int arr[],int len){
int i,j,key;
for(i=1;i<len;i++){
key=arr[i];
j=i-1;
while(j>=0&&arr[j]>key){
arr[j+1]=arr[j];//往右挪动
j--;
}
arr[j+1]=key;
}
}
int main(){
int arr[]={22,34,3,32,82,89,50,37,5,64,35,9,70};
int len=(int)sizeof(arr)/sizeof(*arr);
insertion_sort(arr,len);
int i;
for(i=0;i<len;i++){
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
希尔排序
归并排序
终都是 O(nlogn) 的时间复杂度。代价是需要额外的内存空间
1申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序;
2设定两个指针,最初位置分别为两个已经排序序列的起始位置;
3比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动到下一位置;
4重复步骤 3 直到某一指针达到序列尾;
将另一序列剩下的所有元素直接复制到合并序列尾。
#include<stdio.h>
#include<malloc.h>
int min(int x,int y){
return x<y?x:y;
}
void merge_sort(int arr[], int len) {
int *a = arr;
int *b = (int *) malloc(len * sizeof(int));
int seg, start;
for (seg = 1; seg < len; seg += seg) {
for (start = 0; start < len; start += seg * 2) {
int low = start, mid = min(start + seg, len), high = min(start + seg * 2, len);
int k = low;
int start1 = low, end1 = mid;
int start2 = mid, end2 = high;
while (start1 < end1 && start2 < end2)
b[k++] = a[start1] < a[start2] ? a[start1++] : a[start2++];
while (start1 < end1)
b[k++] = a[start1++];
while (start2 < end2)
b[k++] = a[start2++];
}
int *temp = a;
a = b;
b = temp;
}
if (a != arr) {
int i;
for (i = 0; i < len; i++)
b[i] = a[i];
b = a;
}
free(b);
}
int main(){
int arr[]={22,34,3,32,82,89,50,37,5,64,35,9,70};
int len=(int)sizeof(arr)/sizeof(*arr);
merge_sort(arr,len);
int i;
for(i=0;i<len;i++){
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
递归版本
void merge_sort_recursive(int arr[], int reg[], int start, int end) {
if (start >= end)
return;
int len = end - start, mid = (len >> 1) + start;
int start1 = start, end1 = mid;
int start2 = mid + 1, end2 = end;
merge_sort_recursive(arr, reg, start1, end1);
merge_sort_recursive(arr, reg, start2, end2);
int k = start;
while (start1 <= end1 && start2 <= end2)
reg[k++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++];
while (start1 <= end1)
reg[k++] = arr[start1++];
while (start2 <= end2)
reg[k++] = arr[start2++];
for (k = start; k <= end; k++)
arr[k] = reg[k];
}
void merge_sort(int arr[], const int len) {
int reg[len];
merge_sort_recursive(arr, reg, 0, len - 1);
}
快速排序
1从数列中挑出一个元素,称为 "基准"(pivot);
2重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
3递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序
#include<stdio.h>
void quick_sort(int *a,int x,int y)
{
if(x>=y)
return ;//不可或缺,不然没有出口
int i=x;
int j=y;
int k=a[i];//
while(i<j)
{
while(i<j&&a[j]>=k)
j--;
a[i]=a[j];
while(i<j&&a[i]<=k)
i++;
a[j]=a[i];
}//i===j
a[i]=k;
quick_sort(a,x,i-1);//左边调用函数
quick_sort(a,i+1,y);//右边调用函数
}
int main()
{
int a[]={64, 34, 25, 12, 22, 11, 90};
int n=7;
quick_sort(a,0,n-1);//n-1**
for(int i=0;i<n;i++)
printf("%d ",a[i]);
return 0;
}
堆排序
计数排序
桶排序
简单的桶排序
#include <bits/stdc++.h>
using namespace std;
void barrelSort()
{ //prepare
int a[100]={0};
//handle
int n;cin>>n;
for(int i=0;i<n;i++)
{
int b; cin>>b;
a[b]++;
}
//output
for(int i=0;i<100;i++)
{
if(a[i]!=0)
{
for(int j=0;j<a[i];j++)
{
cout<<i<<" ";
}
}
}
}
int main()
{
barrelSort();
return 0;
}
//5 5 3 5 2 8 max10; min->max sum=5;
//桶排序
深入优化的桶排序
基数排序
标签:sort,arr,include,十大,int,len,排序 来源: https://www.cnblogs.com/firhk/p/16522265.html