C语言排序总汇

合集下载

排序算法 c语言

排序算法 c语言

排序算法 c语言排序算法 C语言排序算法是计算机科学中的一个重要概念,它是将一组数据按照特定的顺序排列的过程。

排序算法可以应用于各种领域,如数据库、图像处理、搜索引擎等。

在本文中,我们将介绍一些常见的排序算法,并使用 C语言实现它们。

1. 冒泡排序冒泡排序是一种简单的排序算法,它的基本思想是通过不断交换相邻的元素,将最大的元素逐渐“冒泡”到数组的末尾。

具体实现如下:```void bubble_sort(int arr[], int n) {int i, j, temp;for (i = 0; i < n - 1; i++) {for (j = 0; j < n - i - 1; j++) {if (arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}}```2. 选择排序选择排序是一种简单的排序算法,它的基本思想是每次从未排序的元素中选择最小的元素,将其放到已排序的末尾。

具体实现如下:```void selection_sort(int arr[], int n) {int i, j, min_idx, temp;for (i = 0; i < n - 1; i++) {min_idx = i;for (j = i + 1; j < n; j++) {if (arr[j] < arr[min_idx]) {min_idx = j;}}temp = arr[i];arr[i] = arr[min_idx];arr[min_idx] = temp;}}```3. 插入排序插入排序是一种简单的排序算法,它的基本思想是将未排序的元素插入到已排序的合适位置。

具体实现如下:```void insertion_sort(int arr[], int n) {int i, j, key;for (i = 1; i < n; i++) {key = arr[i];j = i - 1;while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j--;}arr[j + 1] = key;}}```4. 快速排序快速排序是一种高效的排序算法,它的基本思想是通过分治的方式将数组分成两个子数组,然后对子数组进行排序。

数组排序c语言数组排序方法

数组排序c语言数组排序方法

数组排序c语言数组排序方法在C语言中,可以使用多种排序算法对数组进行排序。

常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等。

下面将详细介绍这些排序算法的原理、实现以及时间复杂度。

1. 冒泡排序(Bubble Sort):冒泡排序是一种简单的排序算法,其基本思想是重复地在相邻的元素之间进行比较和交换,将最大的元素逐渐“浮”到数组的尾部。

具体实现过程如下:cvoid bubbleSort(int arr[], int n) {for (int i = 0; i < n-1; i++) {for (int j = 0; j < n-1-i; j++) {if (arr[j] > arr[j+1]) {交换相邻元素int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}}冒泡排序的时间复杂度为O(n^2),其中n为数组长度。

2. 选择排序(Selection Sort):选择排序也是一种简单的排序算法,其基本思想是每次从未排序的部分中选取最小(或最大)的元素,放到已排序部分的末尾。

具体实现过程如下:cvoid selectionSort(int arr[], int n) {for (int i = 0; i < n-1; i++) {int minIndex = i;for (int j = i+1; j < n; j++) {if (arr[j] < arr[minIndex]) {minIndex = j;}}将最小元素交换到已排序部分的末尾int temp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = temp;}选择排序的时间复杂度为O(n^2)。

3. 插入排序(Insertion Sort):插入排序的基本思想是将数组分为已排序和未排序两部分,每次从未排序部分选择一个元素,插入到已排序部分的正确位置。

c语言各种排序法详细讲解

c语言各种排序法详细讲解

一插入排序1.1 直接插入排序基本思想:每次将一个待排序额记录按其关键码的大小插入到一个已经排好序的有序序列中,直到全部记录排好序。

图解:1.//直接顺序排序2.void InsertSort(int r[], int n)3.{4.for (int i=2; i<n; i++)5. {6. r[0]=r[i]; //设置哨兵7.for (int j=i-1; r[0]<r[j]; j--) //寻找插入位置8. r[j+1]=r[j]; //记录后移9. r[j+1]=r[0];10. }11.for(int k=1;k<n;k++)12. cout<<r[k]<<" ";13. cout<<"\n";14.}1.2 希尔排序基本思想是:先将整个待排序记录序列分割成若干个子序列,在在序列内分别进行直接插入排序,待整个序列基本有序时,再对全体记录进行一次直接插入排序。

图解:代码实现:[cpp]view plain copy1.<span style="font-size:14px;">//希尔排序2.void ShellSort(int r[], int n)3.{4.int i;5.int d;6.int j;7.for (d=n/2; d>=1; d=d/2) //以增量为d进行直接插入排序8. {9.for (i=d+1; i<n; i++)10. {11. r[0]=r[i]; //暂存被插入记录12.for (j=i-d; j>0 && r[0]<r[j]; j=j-d)13. r[j+d]=r[j]; //记录后移d个位置14. r[j+d]=r[0];15. }16. }17.for(i=1;i<n;i++)18. cout<<r[i]<<" ";19. cout<<"\n";20.}</span>二交换排序2.1 起泡排序起泡排序是交换排序中最简单的排序方法,其基本思想是:两两比较相邻记录的关键码,如果反序则交换,直到没有反序的记录为止。

C语言学习知识所有内部排序算法

C语言学习知识所有内部排序算法

C语言所有内部排序算法冒泡法,选择法,插入法,快排法,希尔,归并,... 1冒泡法:#include<stdio.h>#include<stdlib.h>void mao_pao(int *a,int n){int i,j,temp,flag;for(i=0;i<n-1&&flag;++i){flag=0;for(j=0;j<n-1;++j){if(a[j]>a[j+1]){flag=1;temp=a[j];a[j]=a[j+1];a[j+1]=temp;}}}}void main(){int *a,i,n;a=(int *)malloc(100);if(NULL==a){printf("allocation failture\n");exit(1);}printf("请输入你要排序的元素的个数\n");scanf("%d",&n);printf("现在开始输入%d个元素\n",n);for(i=0;i!=n;++i)scanf("%d",&a[i]);mao_pao(a,n);printf("排序后为:\n");for(i=0;i!=n;++i)printf("%d ",a[i]);printf("\n");free(a);}2,选择排序法#include<stdio.h>#include<stdlib.h>void xuan_zhe(int *a,int n) {int i,j,temp,max;for(i=0;i<n-1;++i){max=i;for(j=i+1;j<n;++j){if(a[j]<a[max])max=j;}if(i!=max){temp=a[i];a[i]=a[max];a[max]=temp;}}}void main(){int *a,i,n;a=(int *)malloc(100);if(NULL==a){printf("allocation failture\n");exit(1);}printf("请输入你要排序的元素的个数\n"); scanf("%d",&n);printf("现在开始输入%d个元素\n",n); for(i=0;i!=n;++i)scanf("%d",&a[i]);xuan_zhe(a,n);printf("排序后为:\n");for(i=0;i!=n;++i)printf("%d ",a[i]);printf("\n");free(a);}3,插入排序#include<stdio.h>#include<stdlib.h>void cha_ru(int *a,int n) {int i,j,temp;for(i=0;i<n-1;++i){temp=a[i+1];for(j=i;j>=0&&temp<a[j];--j) a[j+1]=a[j];a[++j]=temp;}}void main(){int *a,i,n;a=(int *)malloc(100);if(NULL==a){printf("allocation failture\n");exit(1);}printf("请输入你要排序的元素的个数\n"); scanf("%d",&n);printf("现在开始输入%d个元素\n",n); for(i=0;i!=n;++i)scanf("%d",&a[i]);cha_ru(a,n);printf("排序后为:\n");for(i=0;i!=n;++i)printf("%d ",a[i]);printf("\n");free(a);}4..快速排序#include<stdio.h>#include<stdlib.h>void kuai_pai(int *a,int low,int high){int left,right,middle,i,j,temp;left=low;right=high;middle=(left+right)/2;while(left<right){while(left<high&&a[left]<a[middle]) left++;while(right>low&&a[right]>a[middle]) right--;if(left<=right){temp=a[left];a[left]=a[right];a[right]=temp;left++;right--;}}if(left<high)kuai_pai(a,left,high);if(right>low)kuai_pai(a,low,right);}void main(){int *a,i,n;a=(int *)malloc(100);if(NULL==a){printf("allocation failture\n");exit(1);}printf("请输入你要排序的元素的个数\n"); scanf("%d",&n);printf("现在开始输入%d个元素\n",n); for(i=0;i!=n;++i)scanf("%d",&a[i]);kuai_pai(a,0,n-1);printf("排序后为:\n");for(i=0;i!=n;++i)printf("%d ",a[i]);printf("\n");free(a);}5..shell排序#include<stdio.h>#include<stdlib.h>void shell(int *a,int n){int gap,i,j,temp;for(gap=n/2;gap>0;gap=gap/2)for(i=gap;i<n;i++)for(j=i-gap;j>=0&&a[j]>a[j+gap];j=j-gap) {temp=a[j];a[j]=a[j+gap];a[j+gap]=temp;}}void main(){int *a,i,n;a=(int *)malloc(100);if(NULL==a){printf("allocation failture\n");exit(1);}printf("请输入你要排序的元素的个数\n"); scanf("%d",&n);printf("现在开始输入%d个元素\n",n); for(i=0;i!=n;++i)scanf("%d",&a[i]);shell(a,n);printf("排序后为:\n");for(i=0;i!=n;++i)printf("%d ",a[i]);printf("\n");free(a);}6.二路归并排序#include<stdio.h>#include<stdlib.h>void gui_bin(int *a,int *b,int k,int n) {int l1,l2,i,j,u1,u2,l=0;l1=0;while(l1+k<n){l2=l1+k;u1=l2-1;u2=(l2+k-1<n)?l2+k-1:n-1;i=l1;j=l2;while(i<=u1&&j<=u2){if(a[i]<=a[j])b[l++]=a[i++];elseb[l++]=a[j++];}while(i<=u1)b[l++]=a[i++];while(j<=u2)b[l++]=a[j++];l1=u2+1;}for(i=l1;i<n;++i)b[l++]=a[i];}void main(){int *a,*b,i,n,k=1;a=(int *)malloc(100);if(NULL==a){printf("allocation failture\n");exit(1);}b=(int *)malloc(100);if(NULL==b){printf("allocation failture\n");exit(1);}printf("请输入你要排序的元素的个数\n"); scanf("%d",&n);printf("现在开始输入%d个元素\n",n); for(i=0;i!=n;++i)scanf("%d",&a[i]);while(k<n){gui_bin(a,b,k,n);for(i=0;i<n;++i)a[i]=b[i];k=k*2;}printf("排序后为:\n");for(i=0;i!=n;++i)printf("%d ",a[i]);printf("\n");free(a);free(b);}7.堆排序思想是,跟节点都比他们的儿子节点都大,之后从第一个非叶子节点开始到最上的跟节点,依次求其的跟节点,最上的根节点就是值最大的点,这样取得最大值之后,继续求根节点,就能得到一个有序序列。

使用C语言实现12种排序方法

使用C语言实现12种排序方法

使⽤C语⾔实现12种排序⽅法⽬录1.冒泡排序2.插⼊排序3.折半插⼊排序4.希尔排序5.选择排序6.鸡尾酒排序7.堆排序8.快速排序9.归并排序10.计数排序11.桶排序12.基数排序1.冒泡排序思路:⽐较相邻的两个数字,如果前⼀个数字⼤,那么就交换两个数字,直到有序。

时间复杂度O(n^2),稳定性:这是⼀种稳定的算法。

代码实现:void bubble_sort(int arr[],size_t len){size_t i,j;for(i=0;i<len;i++){bool hasSwap = false; //优化,判断数组是否已经有序,如果有序可以提前退出循环for(j=1;j<len-i;j++){ //这⾥j<len-i是因为最后⾯的肯定都是最⼤的,不需要多进⾏⽐较if(arr[j-1]>arr[j]){ //如果前⼀个⽐后⼀个⼤swap(&arr[j-1],&arr[j]); //交换两个数据hasSwap = true;}}if(!hasSwap){break;}}}2.插⼊排序思路:把⼀个数字插⼊⼀个有序的序列中,使之仍然保持有序,如对于需要我们进⾏排序的数组,我们可以使它的前i个数字有序,然后再插⼊i+1个数字,插⼊到合适的位置使之仍然保持有序,直到所有的数字有序。

时间复杂度:O(n^2) 稳定性:稳定的算法代码实现:void insert_sort(int arr[],int len){int i,j;for(i=1;i<len;i++){int key = arr[i]; //记录当前需要插⼊的数据for(j= i-1;i>=0&&arr[j]>key;j--){ //找到插⼊的位置arr[j+1] = arr[j]; //把需要插⼊的元素后⾯的元素往后移}arr[j+1] = key; //插⼊该元素}}3.折半插⼊排序思路:本质上是插⼊排序,但是通过半分查找法找到插⼊的位置,让效率稍微快⼀点。

C语言排序方法总结

C语言排序方法总结

C语言排序方法学的排序算法有:插入排序,合并排序,冒泡排序,选择排序,希尔排序,堆排序,快速排序,计数排序,基数排序,桶排序(没有实现)。

比较一下学习后的心得。

我不是很清楚他们的时间复杂度,也真的不知道他们到底谁快谁慢,因为书上的推导我确实只是小小了解,并没有消化。

也没有完全理解他们的精髓,所以又什么错误的还需要高手指点。

呵呵。

1.普及一下排序稳定,所谓排序稳定就是指:如果两个数相同,对他们进行的排序结果为他们的相对顺序不变。

例如A={1,2,1,2,1}这里排序之后是A = {1,1,1,2,2} 稳定就是排序后第一个1就是排序前的第一个1,第二个1就是排序前第二个1,第三个1就是排序前的第三个1。

同理2也是一样。

这里用颜色标明了。

不稳定呢就是他们的顺序不应和开始顺序一致。

也就是可能会是A={1,1,1,2,2}这样的结果。

2.普及一下原地排序:原地排序就是指不申请多余的空间来进行的排序,就是在原来的排序数据中比较和交换的排序。

例如快速排序,堆排序等都是原地排序,合并排序,计数排序等不是原地排序。

3.感觉谁最好,在我的印象中快速排序是最好的,时间复杂度:n*log(n),不稳定排序。

原地排序。

他的名字很棒,快速嘛。

当然快了。

我觉得他的思想很不错,分治,而且还是原地排序,省去和很多的空间浪费。

速度也是很快的,n*log(n)。

但是有一个软肋就是如果已经是排好的情况下时间复杂度就是n*n,不过在加入随机的情况下这种情况也得以好转,而且他可以做任意的比较,只要你能给出两个元素的大小关系就可以了。

适用范围广,速度快。

4.插入排序:n*n的时间复杂度,稳定排序,原地排序。

插入排序是我学的第一个排序,速度还是很快的,特别是在数组已排好了之后,用它的思想来插入一个数据,效率是很高的。

因为不用全部排。

他的数据交换也很少,只是数据后移,然后放入要插入的数据。

(这里不是指调用插入排序,而是用它的思想)。

我觉得,在数据大部分都排好了,用插入排序会给你带来很大的方便。

C语言排序算法大全排序

C语言排序算法大全排序

C语言排序算法大全排序直接插入排序说明:逐个将后一个数加到前面的排好的序中。

在直接插入排序过程中,对其中一个记录的插入排序称为一次排序;直接插入排序是从第二个记录开始进行的,因此,长度为n的记录序列需要进行n-1次排序才能完成整个序列的排序。

时间复杂度为O(n2)。

void InsertSort(elemtype x[],int n)/*用直接插入法对x[0]-x[n-1]排序*/{int i,j;elemtype s;for(i=0;i<n-1;i++){s=x[i+1];j=i;while(j>-1&&s.key<x[j].key){x[j+1]=x[j];j--;}x[j+1]=s;}}---------------------希尔排序说明:希尔排序又称缩小增量排序,增量di可以有各种不同的取法,但最后一次排序时的增量必须为1,最简单可取di+1=di/2(取小)。

时间复杂度为O(n(log2n)2)。

void ShellSort(elemtype x[],int n,intd[],int Number)/*用希尔排序法对记录x[0]-x[n-1]排序,d为增量值数组*//*Number为增量值个数,各组内采用直接插入法排序*/{int i,j,k,m,Span;elemtype s;for(m=0;m<Number;m++){Span=d[m];for(k=0;k<Span;k++){for(i=k;i<n-1;i+=Span)/*这个for之后的是“组内采用直接插入法排序”*/{s=x[i+Span];j=i;while(j>-1&&s.key<x[j].key){x[j+Span]=x[j];j-=Span;}x[j+Span]=s;}}}}----------------------------直接选择排序说明:每次将后面的最小的找出来插入前面的已排好的序中。

c语言优先级顺序表

c语言优先级顺序表

c语言优先级顺序表C语言优先级顺序表简介C语言是一种广泛使用的编程语言,其优先级顺序表是用来确定不同操作符的计算顺序的工具。

在C语言中,不同操作符具有不同的优先级,通过使用优先级顺序表,可以确保表达式的计算按照预期的顺序进行,避免产生错误的结果。

一、基本概念1.1 操作符在C语言中,操作符是用来执行特定操作的符号。

常见的操作符包括算术操作符(如加法、减法等)、关系操作符(如大于、小于等)、逻辑操作符(如与、或等)等。

1.2 优先级操作符的优先级决定了它在表达式中的计算顺序。

具有高优先级的操作符会先于低优先级的操作符进行计算。

例如,在表达式中同时包含加法和乘法操作符时,乘法操作符的优先级高于加法操作符,因此会先进行乘法计算。

1.3 优先级顺序表优先级顺序表是一个用来确定不同操作符优先级的表格。

在C语言中,优先级顺序表按照操作符的优先级从高到低排列,同一优先级的操作符按照从左到右的顺序排列。

通过查阅优先级顺序表,可以确定操作符的计算顺序。

二、常见操作符的优先级顺序2.1 括号括号是用来改变操作符的优先级的工具,括号中的表达式会首先进行计算。

因此,括号具有最高的优先级。

2.2 一元操作符一元操作符是只对一个操作数进行操作的操作符,例如取反操作符(!)、递增操作符(++)等。

一元操作符的优先级高于其他操作符。

2.3 乘法和除法操作符乘法(*)和除法(/)操作符具有相同的优先级,高于加法(+)和减法(-)操作符。

乘法和除法操作符按照从左到右的顺序计算。

2.4 加法和减法操作符加法和减法操作符具有相同的优先级,低于乘法和除法操作符。

加法和减法操作符按照从左到右的顺序计算。

2.5 关系操作符关系操作符用于比较两个操作数的大小关系,例如大于(>)、小于(<)等。

关系操作符的优先级低于算术操作符。

2.6 逻辑操作符逻辑操作符用于进行逻辑运算,例如与(&&)、或(||)等。

逻辑操作符的优先级低于关系操作符。

c语言常用排序

c语言常用排序

C语言常用排序全解1、稳定排序和非稳定排序简单地说就是所有相等的数经过某种排序方法后,仍能保持它们在排序之前的相对次序,我们就说这种排序方法是稳定的。

反之,就是非稳定的。

比如:一组数排序前是a1,a2,a3,a4,a5,其中a2=a4,经过某种排序后为a1,a2,a4,a3,a5,则我们说这种排序是稳定的,因为a2排序前在a4的前面,排序后它还是在a4的前面。

假如变成a1,a4,a2,a3,a5就不是稳定的了。

2、内排序和外排序在排序过程中,所有需要排序的数都在内存,并在内存中调整它们的存储顺序,称为内排序;在排序过程中,只有部分数被调入内存,并借助内存调整数在外存中的存放顺序排序方法称为外排序。

3、算法的时间复杂度和空间复杂度所谓算法的时间复杂度,是指执行算法所需要的计算工作量。

一个算法的空间复杂度,一般是指执行这个算法所需要的内存空间。

======================================================*//*================================================功能:选择排序输入:数组名称(也就是数组首地址)、数组中元素个数================================================*//*====================================================算法思想简单描述:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。

选择排序是不稳定的。

算法复杂度O(n2)--[n的平方]=====================================================*/void select_sort(int *x, int n){int i, j, min, t;for (i=0; i < n; i++){min = i; /*假设当前下标为i的数最小,比较后再调整*/for (j=i+1; j < n; j++){if (*(x+j) < *(x+min)){min = j; /*如果后面的数比前面的小,则记下它的下标*/}}if (min != i) /*如果min在循环中改变了,就需要交换数据*/{t = *(x+i);*(x+i) = *(x+min);*(x+min) = t;}}}/*================================================功能:直接插入排序输入:数组名称(也就是数组首地址)、数组中元素个数================================================*//*====================================================算法思想简单描述:在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。

C语言期末复习整理 排序算法

C语言期末复习整理 排序算法
C语言言 - 排序算法邻元素的大大小小,如果不满足足升序降序的条件,则对其进行行行交换。 一一轮排序后,最大大最小小的元素将会移到末尾。因此进行行行 n-1 轮冒泡之后,整个序列列即变为有 序。
代码实现 (降序排列列) :
#include <stdio.h> void bubble_sort(int a[], int n) {
int i, j; // 总共排序 n-1 轮 for(i = 0; i < n - 1; i++) {
// 找到 i 之后的元素中最大大元素的下标 int max_j = i; for(j = i + 1; j < n; j++)
if(a[j] > a[max_j]) max_j = j;
// 如果最大大元素不不为当前元素,则进行行行交换 if(max_j != i) {
int main()
{ int a[] = {7, 2, 3, 1, 5, 8, 9, 0, 4, 6}; select_sort(a, 10); print_array(a, 10); // 输出排序后的数组 return 0;
}
> 如果需要改为升序排列列,我们只需先找到 i 及之后的最小小元素的下标,再和 a[i] 进行行行交换即可
> 如果需要升序排列列,只需要将 if(a[j] > a[j-1]) 改为 if(a[j] < a[j-1]) 即可
选择排序
原理理
选择排序的原理理是:先找到无无序序列列中的最大大/最小小元素的下标,然后将其与无无序序列列的第一一 个元素进行行行交换。这样序列列的第一一个元素就变为有序,之后我们需要对第一一个元素后面面的无无序 序列列再进行行行选择排序。这样经过 n-1 轮,我们就得到了了一一个有序的序列列。

C语言8大经典排序方法

C语言8大经典排序方法

C语言8大经典排序方法冒泡排序main(){int i,j,temp;int a[10];for(i=0;i<10;i++)scanf ("%d,",&a[i]);for(j=0;j<=9;j++){ for (i=0;i<10-j;i++)if (a[i]>a[i+1]){ temp=a[i];a[i]=a[i+1];a[i+1]=temp;}}for(i=1;i<11;i++)printf("%5d,",a[i] ); printf("\n");}选择排序void sa(int array[],int n) {int i,j,k,temp;for(i=0;i<10;i++){k=i;for(j=i+1;j<n;j++)if(array[j]<array[k])k=j;temp=array[k];array[k]=array[i];array[i]=temp;}}直接插入排序#include"stdio.h"#define MAXSIZE 20int Insertsort(int r[],int n) {int i,j;for(i=2;i<=n;i++){ r[0]=r[i];j=i-1;while(r[0]<r[j]){ r[j+1]=r[j]; j--;}r[j+1]=r[0];for(j=1;j<=n;j++){printf("%d ",r[j]);}printf("\n");}}int main(){int n,i;int r[MAXSIZE];scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d",&r[i]);Insertsort(r,n);}希尔排序#include <stdio.h>void shell_sort(int arr[],int size) {int i,j,k,temp;for(i=size/2;i>0;i/=2){for(j=i;j<size;j++){temp=arr[j];for(k=j-i;k>=0&&temp<arr[k];k-=i) {arr[k+i]=arr[k];}arr[k+i]=temp;}}for(i=0;i<size;i++){printf("%d ",arr[i]);}}void main(){int arr[]={12,34,64,23,87,54,89,45,56,1,3,7,5,4,2}; shell_sort(arr,15);}堆排序#include<time.h>#include<stdio.h>#include<stdlib.h>void sift(int *a,int k,int m){int t;t=a[k];int i;i=k;int j;j=2*i;bool finished=false;while(j<=m&&!finished){if(j<m&&a[j]<a[j+1])j=j+1;if(t>a[j])finished=true;else{a[i]=a[j];i=j;j=2*i;}}a[i]=t;}void createheap(int *a,int length){int n=length;for(int i=n/2;i>=1;--i){sift(a,i,n);}}void heapsort(int *a,int n){createheap(a,n);for(int i=n;i>=2;--i){int x=a[1];a[1]=a[i];a[i]=x;sift(a,1,i-1);}}int main(){int *a;a=new int[10];srand(time(NULL));int i;printf("%s","随机数:");for(i=1;i<=10;i++){a[i]=rand();printf("%d ",a[i]);}printf("\n");heapsort(a,10);printf("%s","排序后:");for(i=1;i<=10;i++) printf("%d ",a[i]);printf("\n");}归并排序#include <stdio.h>#include <stdlib.h>#include <time.h>void Merge(int *R,int low,int m,int high) {int i=low,j=m+1,p=0;int *R1;R1=(int *)malloc((high-low+1)*sizeof(int)); if(!R1)return;while(i<=m&&j<=high)R1[p++]=(R[i]<=R[j])?R[i++]:R[j++]; while(i<=m)R1[p++]=R[i++];while(j<=high)R1[p++]=R[j++];for(p=0,i=low;i<=high;p++,i++) R[i]=R1[p];}void MergeSort(int R[],int low,int high){int mid;if(low<high){mid=(low+high)/2;MergeSort(R,low,mid);MergeSort(R,mid+1,high);Merge(R,low,mid,high);}}int main(void){int i;int a[10]=;int low=0,high=9;srand( (unsigned int)time(NULL) );for (i = 0; i < 10; i++){a[i] = rand() % 100;}MergeSort(a,low,high);for(i=low;i<=high;i++)printf("%d ",a[i]);return 0;}基数排序#include <stdio.h>typedef struct node {int data;int next;} node;int head;int fr[10];int re[10];void Distribute(node *a, int w){int i;for (i=0; i<10; i++) {fr[i] = -1;}for (i=head; i!=-1; i=a[i].next) { int x = a[i].data / w % 10;10=9(十位)if (fr[x] == -1) {fr[x] = re[x] = i;}else {a[re[x]].next = i;re[x] = i;}}for (i=0; i<10; i++) {if (fr[i] != -1) {a[re[i]].next = -1;}}}void Collect(node *a){int i, last;last = -1;for (i=0; i<10; i++) {if (fr[i] != -1) {if (last == -1) {head = fr[i];last = re[i];}else {a[last].next = fr[i];last = re[i];}}}a[last].next = -1;}void Out(node *a, int w){int i, p, k;printf("weight == %d\n", w); for (i=0; i<10; i++) {printf("fr[%d] ", i);p = fr[i];k = 0;while (p != -1) {printf("->%4d ", a[p].data);p = a[p].next;k++;}while (k<3) printf("-------"),k++;printf("-> re[%d]\n", i);}}void Output(node *a, int head){while (head != -1) {printf("%4d", a[head].data);head = a[head].next;}printf("\n");}void main(){node a[10];int i, n = 10, max;max = 0x80000000;printf("max == %d\n", max);printf("Please intput %d numbers~\n", n); for (i=0; i<n; i++) {scanf("%d", &a[i].data);a[i].next = i + 1;if (a[i].data > max) max=a[i].data;}head = 0;a[n - 1].next = -1;Output(a, head);for (i=1; i<=max; i*=10) {Distribute(a, i);Out(a, i);Collect(a);Output(a, head);}}比较排序#include<iostream>int main(){int a,b,c,*p1,*p2,*p3,*p;printf("Please integer three numbers:\n"); scanf("%d%d%d",&a,&b,&c);p1=&a;p2=&b;p3=&c;if(a<b){p=p1;p1=p2;p2=p;}if(a<c){p=p1;p1=p3;p3=p;}if(b<c){p=p2;p2=p3;p3=p;}printf("由大到小排列是:\n");printf("%d,%d,%d\n", *p1, *p2, *p3);}。

十大经典排序算法-C语言

十大经典排序算法-C语言

十大经典排序算法(动图演示,收藏好文)0.1 算法分类十种常见排序算法可以分为两大类:非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。

线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。

0.2 算法复杂度0.3 相关概念稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。

不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。

时间复杂度:对排序数据的总的操作次数。

反映当n变化时,操作次数呈现什么规律。

空间复杂度:是指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。

1冒泡排序是一种简单的排序算法。

它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。

走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

1.1 算法描述▪比较相邻的元素。

如果第一个比第二个大,就交换它们两个;▪对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;▪针对所有的元素重复以上的步骤,除了最后一个;▪重复步骤1~3,直到排序完成。

1.2 动图演示1.3 代码实现function bubbleSort(arr) {var len = arr.length;for (var i = 0; i < len - 1; i++) {for (var j = 0; j < len - 1 - i; j++) {if (arr[j] > arr[j+1]) { // 相邻元素两两对比var temp = arr[j+1]; // 元素交换arr[j+1] = arr[j];arr[j] = temp;}}}return arr;}2选择排序(Selection-sort)是一种简单直观的排序算法。

C语言经典排序大全

C语言经典排序大全

//插入排序#include<stdio.h>void main() {int a[10]; int i,j,k; printf("请输入10个数字!空格隔开\n"); for(i=0;i<10;i++)scanf("%d",&a[i]);for(i=1;i<10;i++){k=a[i];j=i-1;while((j>=0)&&(a[j]>k)){a[j+1]=a[j];j--;}a[j+1]=k;}printf("你输入的数字按照插入排序法由小到大排序后为\n"); for(i=0;i<10;i++)printf("%d",a[i]);printf("\n");}//快速排序#include<stdio.h>void main() {int a[10]; int i; int p(int a[],int low,int high); void q(int a[],int low,int high); printf("请输入10个数字,用空格隔开!!\n"); for(i=0;i<10;i++)scanf("%d",&a[i]);printf("快速排序法由小到大排序后:\n"); for(i=0;i<10;i++)printf("%d",a[i]);int p(int a[],int low,int high); {int key=a[low],p; while(low<high)while(low<high && a[high]>=key) --high;p=a[low];a[low]=a[high];a[high]=p;while(low<high && a[low]<=key) ++low;p=a[high];a[high]=a[low];a[low]=p;}a[low]=key;return low; }void q(int a[],int low,int high); {int j; if(low<high){j=p(a,low,high);q(a,low,j-1);q(a,j+1,high);}}}//冒泡排序#include<stdio.h>void main() {int a[10]; int i,j,k; printf("请输入10个数,用空格隔开!!\n"); for(i=0;i<10;i++)scanf("%d",&a[i]);for(i=0;i<9;i++)for(j=0;j<9-i;j++)if(a[j]>a[j+1]){k=a[j];a[j]=a[j+1];a[j+1]=k;}printf("冒泡排序法由小到大排序后:\n"); for(i=0;i<10;i++)printf("%d",a[i]);printf("\n");}//希尔排序#include<stdio.h>void main() {int a[10]; int i,j,k=9,t; printf("请输入10个数字:之间用空格隔开!!!\n"); for(i=0;i<10;i++)scanf("%d",&a[i]);while(k>0){for(i=k;i<10;i++){j=i-k;while(j>=0)if(a[j]>a[j+k]){t=a[j];a[j]=a[j+k];a[j+k]=t;}else break; }k/=2;}printf("你输入的数字希尔排序由小到大排序为:\n"); for(i=0;i<10;i++)printf("%4d",a[i]);printf("\n");}//选择排序#include<stdio.h>void main() {int a[10]; int i,j,k,m; printf("请输入10个数字,数字间用空格隔开!!\n"); for(i=0;i<10;i++)scanf("%d",&a[i]);for(i=0;i<9;i++){k=i;for(j=i+1;j<10;j++)if(a[k]>a[j])k=j;if(k!=i){m=a[i];a[i]=a[k];a[k]=m;}}printf("由选择法由小到大排序后:\n"); for(i=0;i<10;i++)printf("%d",a[i]);printf("\n");}。

c语言十大经典排序

c语言十大经典排序

c语言十大经典排序1、冒泡排序冒泡排序是最常用的排序算法之一,它通过不断比较相邻的元素大小,并按照规定的顺序交换它们,从而将最大(或最小)的元素逐渐"冒泡"到列表的末尾。

经过多轮迭代后,整个列表便被排序完成。

2、选择排序选择排序是一种简单直观的排序算法,它将列表分为已排序和未排序两部分,每次从未排序部分选择最小(或最大)的元素,并将其放到已排序部分的末尾,直至整个列表排序完成。

3、插入排序插入排序的基本思想是将待排序列表分为已排序和未排序两部分,每次从未排序部分选择一个元素,并将其插入到已排序部分的适当位置,最终完成排序。

4、希尔排序希尔排序是一种改进的插入排序算法,它通过将列表进行分组,并对每个分组进行插入排序,随着排序继续进行,分组的大小逐渐减小,直至变为1,即完成最终的排序。

5、快速排序快速排序是一种高效的排序算法,它采用分治的思想,通过选择一个基准元素,将列表分为两部分,左边部分的元素都小于等于基准元素,右边部分的元素都大于等于基准元素,然后对左右两部分分别进行快速排序,最终完成整个列表的排序。

6、归并排序归并排序利用了分治的思想,将待排序列表递归地分成两个子列表,分别进行排序,然后再将排序好的子列表合并成一个有序列表。

7、堆排序堆排序利用了完全二叉堆的数据结构,通过建立最大堆(或最小堆)来进行排序。

堆排序的主要步骤包括建堆、交换堆顶元素和调整堆的过程,最终实现排序效果。

8、计数排序计数排序是一种非比较排序算法,它通过确定每个元素之前有多少个元素小于它,来确定每个元素的位置。

计数排序适用于一定范围内的整数排序,且时间复杂度为O(n+k),其中n为列表长度,k为计数范围。

9、桶排序桶排序将待排序元素分散到若干个有序的桶中,每个桶单独进行排序,最后将所有桶中的元素合并起来,即可完成排序。

10、基数排序基数排序是一种通过将数据拆分为多个位数进行排序的算法,它从最低位开始,通过每一位上的排序将序列排序多次,直到排序完成。

c语言的排序方法

c语言的排序方法

c语言的排序方法C语言的排序方法排序是计算机科学中非常重要的一个基本操作,它用于将一组无序的数据按照一定的规则进行重新排列,以便更方便地进行查找、插入和删除等操作。

C语言作为一种广泛应用的编程语言,提供了多种排序算法的实现方式,本文将介绍几种常用的排序方法及其实现。

一、冒泡排序(Bubble Sort)冒泡排序是最简单的排序算法之一,它的基本思想是重复地比较相邻的两个元素,如果它们的顺序错误就交换位置,直到没有需要交换的元素为止。

冒泡排序的时间复杂度为O(n^2)。

二、选择排序(Selection Sort)选择排序每次从待排序的数据中选择最小(或最大)的元素放到已排序的数据末尾,直到全部元素排序完成。

选择排序的时间复杂度也为O(n^2)。

三、插入排序(Insertion Sort)插入排序的思想是将一个记录插入到已经排好序的有序表中,形成一个新的有序表。

插入排序的时间复杂度为O(n^2),但在实际应用中,插入排序常常比其他排序算法更有效。

四、快速排序(Quick Sort)快速排序是一种基于分治法的排序算法,它通过选择一个基准元素,将待排序的数据分割成两部分,其中一部分的所有元素都比基准元素小,另一部分的所有元素都比基准元素大,然后对这两部分继续进行快速排序。

快速排序的时间复杂度为O(nlogn)。

五、归并排序(Merge Sort)归并排序采用分治法的思想,将待排序的数据分为两个子序列,分别进行排序,然后将两个有序的子序列合并成一个有序的序列。

归并排序的时间复杂度为O(nlogn)。

六、堆排序(Heap Sort)堆排序利用堆这种数据结构进行排序,它将待排序的数据构建成一个大顶堆或小顶堆,然后依次将堆顶元素与最后一个元素交换,并对剩余的元素重新调整堆,重复这个过程直到所有元素都排序完成。

堆排序的时间复杂度为O(nlogn)。

七、希尔排序(Shell Sort)希尔排序是一种改进的插入排序算法,它通过将待排序的数据分组,分组内进行插入排序,然后逐渐缩小分组的间隔,最终完成排序。

C语言最常用的六种排序方法详解

C语言最常用的六种排序方法详解

1.冒泡排序:
2.简单选择排序:
3.快速排序:
设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。

4.直接插入排序:
5.折半插入排序:
折半插入排序(binary insertion sort)是对插入排序算法的一种改进,在将一个新元素插入已排好序的数组的过程中,寻找插入点时,将待插入区域的首元素设置为a[low],末元素设置为
a[high],则轮比较时将待插入元素与a[m],其中m=(low+high)/2相比较,如果比参考元素小,则选择a[low]到a[m-1]为新的插入区域(即high=m-1),否则选择a[m+1]到a[high]为新的插入区域(即low=m+1),如此直至low<=high不成立,即将此位置之后所有元素后移一位,并将新元素插入a[high+1]。

代码:
6.希尔排序:。

C语言9种常用排序法讲解

C语言9种常用排序法讲解

C语言9种常用排序法1.冒泡排序2.选择排序3.插入排序4.快速排序5.希尔排序6.归并排序7.堆排序8.带哨兵的直接插入排序9.基数排序例子:乱序输入n个数,输出从小到大排序后的结果1.冒泡排序#include<stdio.h>int main(){int i, j, n, a[100], temp;while(scanf("%d",&n)!=EOF){for(i=0;i<n;i++)scanf("%d",&a[i]);for(i=0;i<n-1;i++) //总共需冒泡n-1次{for(j=0;j<n-i-1;j++) //第i趟冒泡{if(a[j]>a[j+1]) //比较a[j]与a[j+1],使a[j+1]大于a[j] {temp = a[j+1];a[j+1] = a[j];a[j] = temp;}}}for(i=0;i<n;i++) //打印printf("%d ",a[i]);printf("\n");}return 0;}2.选择排序#include<stdio.h>int main(){int i, j, n, a[100], t, temp;while(scanf("%d",&n)!=EOF){for(i=0;i<n;i++)scanf("%d",&a[i]);for(i=0;i<n-1;i++) //总共排序n-1趟{t = i;for(j=i+1;j<n;j++) //第i趟从a[i+1]~a[n-1]中选最小的数与a[i]交换 {if(a[t]>a[j])t = j;}temp = a[i];a[i] = a[t];a[t] = temp;}for(i=0;i<n;i++)printf("%d ",a[i]);printf("\n");}return 0;}3.快速排序/*1.假设数组为a[n];2.第一次排序过程如下:取x = 0 ( a[0]为中轴 );i=0 (第一个元素下标), j=n-1(最后一个元素下标);重复下面过程:(直到i>=j){从a[j]起,向前找小于a[x]的元素,同时j--,找到后,a[j]与a[x]交换,x=j;从a[i]起,向后找大于a[x]的元素,同时i++,找到后,a[i]与a[x]交换,x=i; }3.注意快排函数是迭代函数,必须要有结束条件 (因为忽略结束条件,调试了很久......)4.再对a[low]~a[x-1]、a[x+1]~a[high]分别调用快排函数*/#include<stdio.h>void quicksort(int a[],int low,int high);int main(){int i, n, a[100];while(scanf("%d",&n)!=EOF){for(i=0;i<n;i++)scanf("%d",&a[i]);quicksort(a,0,n-1);for(i=0;i<n;i++)printf("%d ",a[i]);printf("\n");}return 0;}void quicksort(int a[],int low,int high){if(low>=high) return; //坑爹的结束条件,return后面不能跟数值 int i=low, j= high, x=i, temp;while(i<j){for(;a[j]>=a[x]&&i<j;j--);if(i<j){temp = a[j];a[j] = a[i];a[i] = temp;x = j;i++;}elsebreak; //i>=j即可跳出本次while循环for(;a[i]<=a[x]&&i<j;i++);if(i<j){temp = a[i];a[j] = temp;x = i;j--;}elsebreak; //跳出本次while循环 }quicksort(a,low,x-1);quicksort(a,x+1,high);}4.插入排序法#include<stdio.h>void show(int a[],int n) //输出数组{int i;for(i=0;i<n;i++)printf("%d ",a[i]);printf("\n");}void insertsort(int a[],int n);int main(){while(scanf("%d",&n)!=EOF){for(i=0;i<n;i++)scanf("%d",&a[i]);insertsort(a,n);show(a,n);}return 0;}void insertsort(int a[],int n){int i ,j ,k ,temp;for(i=1;i<n;i++) //插入a[i]{j=i-1;for(;a[i]<a[j]&&j>=0;j--); //寻找插入点j++;if(j==i) //该数有序,不需要前插continue;else{temp=a[i];for(k=i-1;k>=j;k--) //将插入点后面的数依次后移一位 {a[k+1]=a[k];}}}}5.shell排序法#include<stdio.h>void show(int a[],int n) //输出数组{int i;for(i=0;i<n;i++)printf("%d ",a[i]);printf("\n");}void shellsort(int a[],int n);int main(){int i, n, a[100];while(scanf("%d",&n)!=EOF){for(i=0;i<n;i++)scanf("%d",&a[i]);shellsort(a,n);show(a,n);}return 0;}void shellsort(int a[],int n){int k ,i ,j ,l ,temp;k = n/2;while(k>=1){for(i=k;i<n;i++){if(a[i]>=a[i-k]) //已经有序,不需要移动continue;else{for(j=i-k;a[j]>=a[i]&&j>=0;j=j-k); j+=k; //寻找插入点a[j] temp = a[i]; // 保存a[i]for(l=i-k;l>=j;l-=k) //依次向后移动k个位置{a[l+k] = a[l];}a[j]=temp; //插入}}k = k/2;}}6.归并排序归并排序是一种很容易进行并行化的算法,因为归并的各个数据区间都是独立的,没有依赖关系。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C语言排序总汇
1、插入法排序
算法如下:
voidInsertsort(int n)
{
inti,j;
for(i=2;i<=n;i++) /*依次插入R[2],R[3],.....R[n]*/
if(R[i]<R[i-1])
{
R[0]=R[i];j=i-1;/*R[0]是哨兵,且是R[i]的副本*/
do{/*从右向左在有序区R[1....i-1]中查找R[i]的插入位置*/
R[j+1]=R[j];/*将关键字大于R[i]的记录后移*/
j--;
}
while(R[0]<R[j]); /*当R[i]>=R[j]时终止*/
R[j+1]=R[0];/*R[i]插入到正确的位置*/
}
}
程序代码
#include<stdio.h>
#define MAX 255/*用户可以自己选*/
int R[MAX];
voidInsertsort(int n)
{
inti,j;
for(i=2;i<=n;i++) /*依次插入R[2],R[3],.....R[n]*/
if(R[i]<R[i-1])
{
R[0]=R[i];j=i-1;/*R[0]是哨兵,且是R[i]的副本*/
do{/*从右向左在有序区R[1....i-1]中查找R[i]的插入位置*/
R[j+1]=R[j];/*将关键字大于R[i]的记录后移*/
j--;
}
while(R[0]<R[j]); /*当R[i]>=R[j]时终止*/
R[j+1]=R[0];/*R[i]插入到正确的位置*/
}
}
main()
{
inti,n;
puts("Please input total element number of the sequence:"); scanf("%d",&n);
if(n<=0||n>MAX)
{
printf("n must more than 0 and less than %d.\n",MAX);
}
puts("Please input the elements one by one :");
for(i=1;i<n;i++)
scanf("%d",&R[i]);
puts("The sequence you input is :");
for(i=1;i<=n;i++)
printf("%4d",R[i]);
Insertsort(n);
puts("\nThesequnce after Insertsort is:");
for(i=1;i<=n;i++)
printf("%4d",R[i]);
puts("\n Press any key to quit.....");
}
2.希尔排序
voidShellpass(intd,int n)
{/*希尔排序的一趟排序,d为当前增量*/
inti,j;
for(i=d+1;i<=n;i++)/*将R[d+1...n]分别插入个组当前的有序区*/ if(R[i]<R[i-d])
R[0]=R[i];j=i-d;/*R[0]只是暂存单元,不是哨兵*/
do{/*查找R[i]的插入位置*/
R[j+d]=R[j];/*后移记录*/
j=j-d;/*查找前一记录*/
}while(j>0&&R[0]<R[j]);
R[j+d]=R[0];/*插入R[i到正确位置上*/
}
}
voidShellsort(int n)
{
int increment=n;/*增量初值,设n>0*/
do{
increment=increment/3+1;/求下一增量*/
Shellpass(increment,n);/*一趟增量为increment的Shell插入排序*/ }while(increment>1);
}
其程序代码跟上述差不多,只不过是函数的调用
3.冒泡排序
voidBubbsort(int n)
{/*R(1.....n)是待排序文件,采用自下向上扫描,对R做,冒泡排序*/
intexce;/*交换标志*/
for(i=1;i<n;i++)
{/*最多做n-1趟排序*/
exce=0;/*本趟排序开始前,交换标志应为假*/
for(j=n-1;j>=i;j--)/*对当前无序区R[i....n]自下向上扫描*/ if(R[j+1]<R[j]){/*交换记录*/
R[0]=R[j+1];
R[j+1]=R[j];
R[j]=R[0];
exce=1;/*发生交换,交换标志为真*/
}
if(!exce)/*本趟排序未发生交换,提前终止算法*/
return;
}
4.选择排序
voidSelectsort(int n)
{/*做第i趟排序(1<=i<=n)*/
inti,j,k;
for(i=1;i<n;i++)
{
k=i;
for(j=i+1;j<=n;j++)/*在当前无序区R[i...n]中选key最小的记录R[k]*/ if(R[j]<R[k])
k=j;/*k记下目前找到的最小关键字所在的位置*/
if(k!=i)
{
R[0]=R[i];R[i]=R[k];R[k]=R[0];/*交换R[i]和R[k]*/
}
}
}
5.快速排序
int Partition(inti,int j)
{/*调用Partition(low,high)时,对R[low....high]做划分,并返回基准记录的位置*/
int pivot=R[i];/*用区间的第一条记录作为基准*/
while(i<j){/*从两端向中间扫描,直至i=j为止*/
while(i<j&&R[j]>=pivot)
j--;
if(i<j)/*表示找到了R[j]关键字小于pivot*/
R[i++]=R[j];/*相当于交换R[i]和R[j],交换后i指针加1*/
while(i<j&&R[i]<=pivot)
i++;
if(i<j)
R[j--]=R[i];
}
R[i]=pivot;/*基准记录位置最后定位*/
returni;
}
void Quicksort(intlow,int high)
{/*对R[low...high]快速排序*/
intpivotpos;
if(low<high){/*当区间大于1时才需排序*/
pivotpos=Partition(low,high);/*对R[low...high]做划分*/
Quicksort(low,pivotpos-1);/*对左区间递归排序*/
Quicksort(pivotpos+1,high);
}
}
6.堆排序
voidHeapify(ints,int m)
{
intj,temp;
temp=R[s];
j=2*s;
while(j<=m)
{
if(R[j]>R[j+1]&&j<m) j++;
if(temp<R[j]) break;
R[s]=R[j];
s=j;
j=j*2;
}
R[s]=temp;
}
voidBuildheap(int n)
{
inti;
for(i=n/2;i>0;i--)
Heapify(i,n);
}
其实这些排序实质是一样的,可以分为几类吧!插入的算法思想用的比较多!!另外有些我没注释,这些用的比较少!!!
江西师范大学
Spride星
一品浪子y星(微博)。

相关文档
最新文档