数据结构之——交换排序

1.交换排序算法实现

这里的交换排序指的是冒泡排序和快速排序,

其中快速排序的过程可以简单的理解为:选取序列首元素为枢轴值(pivot),然后分别从序列尾部找到第一个小于pivot的元素(A),从序列首部找到第一个大于pivot的元素(B),然后交换此A,B两元素,直至首尾遍历的两指针重合,一趟排序结束。

以下是这两算法的具体实现:

 1 #include<iostream>
 2 using namespace std;
 3
 4 //声明打印辅助函数
 5 void printArray(int array[], int length);
 6 //声明冒泡排序函数
 7 void BubbleSort(int array[], int lenght);
 8 //声明分割函数,供快速排序函数调用
 9 int Partition(int array[], int low, int high);
10 //声明快速排序函数
11 void QuickSort(int array[], int low, int high);
12
13 int main()
14 {
15     int array[] = { 12, 3, 6, 4, 27, 9 };
16     int length = sizeof(array) / sizeof(*array);
17
18     cout << "排序前序列为:" << endl;
19     printArray(array, length);
20
21     BubbleSort(array, length);
22     cout << endl << "冒泡排序后序列为:" << endl;
23     printArray(array, length);
24     cout << endl;
25
26     QuickSort(array, 0, length - 1);
27     cout << endl << "快速排序后序列为:" << endl;
28     printArray(array, length);
29     cout << endl;
30
31     cout <<endl;
32     system("pause");
33     return 0;
34 }
35
36 void printArray(int array[], int length)
37 {
38     for (int i = 0; i < length; i++)
39     {
40         if (i == length - 1)
41             cout << array[i];
42         else
43             cout << array[i] << ",";
44     }
45 }
46
47 void BubbleSort(int array[], int lenght)
48 {
49     int tmp;
50     //标记是否发生了交换
51     bool flag;
52     for (int i = 0; i < lenght;i++)
53     {
54         flag = false;
55         for (int j = lenght - 1; j >i; j--)
56         {
57             if (array[j-1]>array[j])
58             {
59                 tmp = array[j - 1];
60                 array[j - 1] = array[j];
61                 array[j] = tmp;
62                 flag = true;
63             }
64         }
65         //一趟排序未发生交换时,表示已经排序已经完成
66         if (flag==false)
67         {
68             return;
69         }
70     }
71 }
72
73 int Partition(int array[], int low, int high)
74 {
75     int pivot = array[low];
76     while (low<high)
77     {
78         while (low < high && array[high] >= pivot) high--;
79         array[low] = array[high];
80         while (low < high && array[low] <= pivot) low++;
81         array[high] = array[low];
82     }
83     array[low] = pivot;
84     return low;
85 }
86
87 void QuickSort(int array[], int low, int high)
88 {
89     if (low<high)
90     {
91         int pivot = Partition(array, low, high);
92         QuickSort(array, low, pivot - 1);
93         QuickSort(array, pivot + 1, high);
94     }
95 }

2.关于交换排序的一些结论

(1).为实现快速排序算法,待排序序列宜采用的存储方式为顺序存储。

(2).就平均性能而言,快速排序是目前最好的内部排序算法,但是当要排序的数据已经基本有序时,不宜使用快速排序算法。

(3).快速排序过程构成一棵递归树,递归深度即为递归树的深度,当枢轴值每次将序列等分时,递归树的高为log2n;当枢轴值每次都是子表的最大值或者最小值时,此时递归树退化为单链表,树高为n。

时间: 2024-08-23 15:47:14

数据结构之——交换排序的相关文章

数据结构例程—— 交换排序之快速排序

本文是[数据结构基础系列(9):排序]中第5课时[交换排序之快速排序]的例程. 1.以第1个元素作为基准 #include <stdio.h> #define MaxSize 20 typedef int KeyType; //定义关键字类型 typedef char InfoType[10]; typedef struct //记录类型 { KeyType key; //关键字项 InfoType data; //其他数据项,类型为InfoType } RecType; //排序的记录类型定

数据结构例程——交换排序之冒泡排序

本文是[数据结构基础系列(9):排序]中第4课时[交换排序之冒泡排序]的例程. 冒泡排序 #include <stdio.h> #define MaxSize 20 typedef int KeyType; //定义关键字类型 typedef char InfoType[10]; typedef struct //记录类型 { KeyType key; //关键字项 InfoType data; //其他数据项,类型为InfoType } RecType; //排序的记录类型定义 void B

《大话数据结构》学习笔记 排序

排序的严格定义:  假设含有n个记录的序列为{r1,r2,......,rn},对应的关键字分别为{k1,k2......,kn},需确定1,2,......,n的一种排列p1,p2,......,pn,使其相应的关键字 满足Kp1<=Kp2<=......Kpn关系,即使得序列成为一个按关键字有序的序列(rpq,rp2,......rpn),此操作称为排序.  排序的稳定性:内排序与外排序(根据记录是否全部放置在内存中). 根据排序中的主要操作,可以分为插入排序类(直接插入排序->希尔

数据结构复习:交换排序原理及C++实现

1. 交换排序的基本思想 两两比较key值,如果发生逆序(排列的顺序与期望的顺序相反)就交换,知道所有对象都排序完毕!常见的3种交换排序算法:冒泡排序,shaker排序和快速排序. 2. 冒泡排序 设待排序列中有 n 个对象, 首先比较对象v[n-1]和v[n-2], 如果v[n-1] < v[n-2],则交换v[n-1]和v[n-2],然后对v[n-i]和v[n-i-1]进行同样操作,知道对v[1]和v[0]进行完操作,每一次冒泡,使得值小的对象前移动,如此重复,直至有序,图解如下: 3.Sh

SDUT 3399 数据结构实验之排序二:交换排序

数据结构实验之排序二:交换排序 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 冒泡排序和快速排序都是基于"交换"进行的排序方法,你的任务是对题目给定的N个(长整型范围内的)整数从小到大排序,输出用冒泡和快排对这N个数排序分别需要进行的数据交换次数. Input 连续多组输入数据,每组数据第一行给出正整数N(N ≤ 10^5),随后给出N个整数,数字间以空格分隔. Output

SDUT-3399_数据结构实验之排序二:交换排序

数据结构实验之排序二:交换排序 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 冒泡排序和快速排序都是基于"交换"进行的排序方法,你的任务是对题目给定的N个(长整型范围内的)整数从小到大排序,输出用冒泡和快排对这N个数排序分别需要进行的数据交换次数. Input 连续多组输入数据,每组数据第一行给出正整数N(N ≤ 10^5),随后给出N个整数,数字间以空格分隔. Output 输出数据占一行,代表冒泡排序

数据结构的故事之交换排序

交换排序,顾名思义,肯定是通过两个数或者几个数之间的比较和交换来达到排序的目的.基于交换的排序主要有冒泡排序和快速排序. 1.冒泡排序 通过两两之间的比较和交换,每次冒出一个最大的记录(升序)或者最小的记录(降序). void bubbleSort(int arr[],int n){ int outer,inner; for(outer=1;outer<=n;outer++){ for(inner=1;inner<=n-outer;inner++){ if(arr[inner+1]<ar

数据结构与算法之排序算法(二):交换排序

交换排序可以分为:冒泡排序和快速排序.其中快速排序是对冒泡排序的改进 1.冒泡排序 原理:比较临近的两个数字,按照从小到大的顺序进行交换,这样一趟过去后,最大(最小)的数字被交换到了最后一位,然后再从头开始进行两两比较交换,直到倒数第i位时结束. 代码实现: for(int i=0;i<a.length-1;i++){ for(int j=i + 1; j<a.length;j++){ if(a[j] < a[j-1]){ a[j] = a[j] ^ a[j-1]; a[j-1] = a

《数据结构:邓俊辉版》——交换排序

void SelectSort(int nLen) { for (int i = 0; i < nLen; i++) { int j = i; int nMax = i; while (j < nLen) { if (g_szArray[j] > g_szArray[nMax]) { nMax = j; } j++; } int tmp = g_szArray[i]; g_szArray[i] = g_szArray[nMax]; g_szArray[nMax] = tmp; } } 原