程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#深入解析Json格式內容,

C#深入解析Json格式內容,

編輯:C#入門知識

C#深入解析Json格式內容,


繼上一篇《淺談C#手動解析Json格式內容》我又來分析加入了一些功能讓 這個解析類更實用

本章節最會開放我最終制作成功的Anonymous.Json.dll這個解析庫 需要的拿走~

功能繼上一篇增加了許多上一篇只是講述了  解析的步驟但是 至於一些擴展的功能卻沒有涉及

本文將繼續講解

1.如何將json轉換為一個類或者結構 甚至屬性

2.如何將一個類或者結構甚至屬性轉換為json

就這兩點就已經很頭疼了 诶 廢話不多說進入正題

 

上一篇一直有個很神秘的JsonObject沒有講解 現在先來揭開JsonObject的神秘面紗

internal bool _isArray = false; /// <summary> /// 是否為json array類型 /// </summary> public bool IsArray { get { return _isArray; } } internal bool _isString = false; /// <summary> /// 是否為json string類型 /// </summary> public bool IsString { get { return _isString; } } internal bool _isBool = false; /// <summary> /// 是否為json bool類型 /// </summary> public bool IsBool { get { return _isBool; } } internal bool _isObject = false; /// <summary> /// 是否為json object類型 /// </summary> public bool IsObject { get { return _isObject; } } internal bool _isChar = false; /// <summary> /// 是否為json char類型 /// </summary> public bool IsChar { get { return _isChar; } } internal bool _isInt; /// <summary> /// 是否為json 整數型 /// </summary> public bool IsInt { get { return _isInt; } } internal bool _isLong; /// <summary> /// 是否為json 長整數型 /// </summary> public bool IsLong { get { return _isLong; } } internal bool _isDouble; /// <summary> /// 是否為json 浮點型 /// </summary> public bool IsDouble { get { return _isDouble; } } internal bool _isNull = false; /// <summary> /// 是否為json null /// </summary> public bool IsNull { get { return _isNull; } } /// <summary> /// 將object轉換為JsonObject /// </summary> /// <param name="obj"></param> public JsonObject(object obj) { ConvertToJsonObject(this, obj); } /// <summary> /// 定義一個任意類型的隱式轉換 /// </summary> /// <param name="obj"></param> /// <returns></returns> public static implicit operator JsonObject(string obj) { return ImplicitConvert(obj); } public static implicit operator JsonObject(int obj) { return ImplicitConvert(obj); } public static implicit operator JsonObject(double obj) { return ImplicitConvert(obj); } public static implicit operator JsonObject(float obj) { return ImplicitConvert(obj); } public static implicit operator JsonObject(long obj) { return ImplicitConvert(obj); } public static implicit operator JsonObject(decimal obj) { return ImplicitConvert(obj); } private static JsonObject ImplicitConvert(object convert) { JsonObject obj = new JsonObject(); obj.ValueConvertToJsonObject(convert.ToString(), false); return obj; } /// <summary> /// 轉換形態 /// </summary> /// <param name="parent"></param> /// <param name="sourceObj"></param> /// <returns>如果是基本類型返回false直接進行設置</returns> private bool ConvertToJsonObject(JsonObject parent, object sourceObj) { if (sourceObj == null) return false; Type t = sourceObj.GetType(); if (t.IsGenericType) { Type ctorType = t.GetGenericTypeDefinition(); if (ctorType == typeof(List<>)) { parent._isArray = true; parent._sourceObj = new List<JsonObject>(); int count = (int)t.GetProperty("Count").GetValue(sourceObj, null); MethodInfo get = t.GetMethod("get_Item"); for (int i = 0; i < count; i++) { object value = get.Invoke(sourceObj, new object[] { i }); JsonObject innerObj = new JsonObject(); if (!ConvertToJsonObject(innerObj, value)) { innerObj.ValueConvertToJsonObject(value.ToString(), false); } parent.add(innerObj); } } else if (ctorType == typeof(Dictionary<,>)) { parent._isObject = true; parent._sourceObj = new Dictionary<string, JsonObject>(); int count = (int)t.GetProperty("Count").GetValue(sourceObj, null); object kv_entity = t.GetMethod("GetEnumerator").Invoke(sourceObj, null); Type entityType = kv_entity.GetType(); for (int i = 0; i < count; i++) { bool mNext = (bool)entityType.GetMethod("MoveNext").Invoke(kv_entity, null); if (mNext) { object current = entityType.GetProperty("Current").GetValue(kv_entity, null); Type currentType = current.GetType(); object key = currentType.GetProperty("Key").GetValue(current, null); object value = currentType.GetProperty("Value").GetValue(current, null); if (!(key is string)) throw new Exception("json規范格式不正確 Dictionary起始key應為string類型"); JsonObject innerObj = new JsonObject(); innerObj._key = key.ToString(); if (!ConvertToJsonObject(innerObj, value)) { innerObj.ValueConvertToJsonObject(value.ToString(), false); } parent.add(innerObj); } } } else { throw new Exception("不支持的泛型操作"); } return true; } else if (t.IsArray) { parent._isArray = true; parent._sourceObj = new List<JsonObject>(); int rank = t.GetArrayRank(); if (rank > 1) { throw new Exception("暫不支持超過1維的數組"); } else { int length_info = Convert.ToInt32(t.GetProperty("Length").GetValue(sourceObj, null)); for (int i = 0; i < length_info; i++) { object innerObj = t.GetMethod("GetValue", new Type[] { typeof(int) }).Invoke(sourceObj, new object[] { i }); JsonObject obj = new JsonObject(); if (!ConvertToJsonObject(obj, innerObj)) { obj.ValueConvertToJsonObject(innerObj.ToString(), false); } parent.add(obj); } } return true; } else if ((t.IsValueType && !t.IsPrimitive) || (t.IsClass && !(sourceObj is string))) { parent._isObject = true; parent._sourceObj = new Dictionary<string, JsonObject>(); PropertyInfo[] infos = t.GetProperties(BindingFlags.Instance | BindingFlags.Public); foreach (PropertyInfo item in infos) { JsonObject innerObj = new JsonObject(); innerObj._key = item.Name; object obj = item.GetValue(sourceObj, null); if (!ConvertToJsonObject(innerObj, obj)) { innerObj.ValueConvertToJsonObject(obj == null ? "null" : obj.ToString(), false); } parent.add(innerObj); } return true; } else { parent.ValueConvertToJsonObject(sourceObj.ToString(), false); return false; } } public JsonObject() { } /// <summary> /// 如果為json object提取索引內容 /// </summary> /// <param name="index">key</param> /// <returns></returns> public JsonObject this[string index] { get { if (IsObject) { if (ContainsKey(index)) { return dictionary()[index]; } else { throw new Exception("不包含 key: " + index); } } else { throw new Exception("該對象不是一個json object類型請用IsObject進行驗證後操作"); } } set { if (IsObject) { if (value is JsonObject) { dictionary()[index] = value; } else { dictionary()[index] = new JsonObject(value); } } else { throw new Exception("該對象不是一個json object類型請用IsObject進行驗證後操作"); } } } /// <summary> /// 如果為json array提取索引內容 /// </summary> /// <param name="index">index</param> /// <returns></returns> public JsonObject this[int index] { get { if (IsArray) { if (index >= Count || index <= -1) throw new Exception("索引超出數組界限"); return array()[index]; } else { throw new Exception("該對象不是一個json array類型請用IsArray進行驗證後操作"); } } set { if (IsArray) { if (value is JsonObject) { array()[index] = value; } else { array()[index] = new JsonObject(value); } } else { throw new Exception("該對象不是一個json array類型請用IsArray進行驗證後操作"); } } } /// <summary> /// 為json object 設置值如果存在則覆蓋 /// </summary> /// <param name="key"></param> /// <param name="value"></param> public void Set(string key, object value) { if (IsObject) { Dictionary<string, JsonObject> objs = dictionary(); if (objs.ContainsKey(key)) { if (value is JsonObject) objs[key] = (JsonObject)value; else objs[key] = new JsonObject(value); } else { if (value is JsonObject) objs.Add(key, (JsonObject)value); else objs.Add(key, new JsonObject(value)); } } else { this._isArray = false; this._isBool = false; this._isChar = false; this._isDouble = false; this._isInt = false; this._isLong = false; this._isNull = false; this._isObject = true; this._isString = false; this._key = null; this._sourceObj = new Dictionary<string, JsonObject>(); } } /// <summary> /// 為json object 設置值如果存在則覆蓋 /// </summary> /// <param name="key"></param> /// <param name="value"></param> public void Set<T>(string key, T value) { Set(key, value); } /// <summary> /// 為json array 添加值 /// </summary> /// <param name="key"></param> /// <param name="value"></param> public void Add(object value) { if (IsArray) { List<JsonObject> objs = array(); if (value is JsonObject) objs.Add((JsonObject)value); else objs.Add(new JsonObject(value)); } else { this._isArray = true; this._isBool = false; this._isChar = false; this._isDouble = false; this._isInt = false; this._isLong = false; this._isNull = false; this._isObject = false; this._isString = false; this._key = null; this._sourceObj = new List<JsonObject>(); } } /// <summary> /// 為json array 添加值 /// </summary> /// <param name="key"></param> /// <param name="value"></param> public void Add<T>(T value) { Add(value); } /// <summary> /// 刪除一個json object針對json object /// </summary> /// <param name="key"></param> public void Remove(string key) { if (this.IsObject) { dictionary().Remove(key); } } /// <summary> /// 刪除一個json object針對json array /// </summary> /// <param name="key"></param> public void Remove(int index) { if (this.IsArray) { array().RemoveAt(index); } } /// <summary> /// 檢測json object是否包含這個key /// </summary> /// <param name="key"></param> /// <returns></returns> public bool ContainsKey(string key) { return dictionary().ContainsKey(key); } /// <summary> /// 獲得json object或者json array的總數量 /// </summary> public int Count { get { if (IsArray) return array().Count; else if (IsObject) return dictionary().Count; return -1; } } /// <summary> /// 將json object原始數據轉換出去 /// </summary> /// <returns></returns> public override string ToString() { return _sourceObj.ToString(); } /// <summary> /// json key /// </summary> internal string _key; /// <summary> /// 源可替代為任何數據 /// Dictionary<,> /// List<> /// String /// Int /// Double /// Bool /// 等 /// </summary> internal object _sourceObj; /// <summary> /// 將源數據轉換為json array /// </summary> /// <returns></returns> internal List<JsonObject> array() { if (_sourceObj is List<JsonObject>) { return (List<JsonObject>)_sourceObj; } else { return null; } } /// <summary> /// 將源數據轉換為json dictionary /// </summary> /// <returns></returns> internal Dictionary<string, JsonObject> dictionary() { if (_sourceObj is Dictionary<string, JsonObject>) { return (Dictionary<string, JsonObject>)_sourceObj; } else { return null; } } /// <summary> /// 封裝了個簡便的添加方法 /// </summary> /// <param name="obj"></param> internal void add(JsonObject obj) { if (this.IsObject) { Dictionary<string, JsonObject> objs = dictionary(); objs.Add(obj._key, obj); } else if (this.IsArray) { List<JsonObject> objs = array(); objs.Add(obj); } } /// <summary> /// 將json string 轉換為對應的實體object /// </summary> /// <param name="value"></param> /// <param name="isFromComma">判斷是否來自逗號這樣好驗證格式不正常的string</param> internal void ValueConvertToJsonObject(string value, bool isFromComma) { //如果為string類型解析開始解析 json string if (value is string) { string str = value.ToString(); bool isBaseType = false; if (str.IndexOf(".") != -1) { //嘗試解析double double out_d = -1; if (double.TryParse(str, out out_d)) { isBaseType = true; this._isDouble = true; this._sourceObj = out_d; } } else { //嘗試解析長整數型 long out_l = -1; if (long.TryParse(str, out out_l)) { isBaseType = true; //如果小於長整數 換算為整數類型 if (out_l <= int.MaxValue && out_l >= int.MinValue) { this._isInt = true; _sourceObj = (int)out_l; } else { this._isLong = true; _sourceObj = out_l; } } } if (!isBaseType) { if (str.ToLower().Equals("null")) { this._isNull = true; } else if (str.ToLower().Equals("true") || str.ToLower().Equals("false")) { this._isBool = true; this._sourceObj = bool.Parse(str.ToLower()); } else { if (!isFromComma) { this._isString = true; int idx = str.IndexOf("\\u"); while (idx != -1) { string v = str.Substring(idx, 6); string hex1 = v.Substring(2, 2); string hex2 = v.Substring(4); byte[] bytes = new byte[2] { Convert.ToByte(hex2,16), Convert.ToByte(hex1,16) }; str = str.Replace(v, Encoding.Unicode.GetString(bytes)); idx = str.IndexOf("\\u"); } _sourceObj = str; } else { throw new Exception("json字符串格式有誤 請加單引號或雙引號"); } } } } } /// <summary> /// 直接返回源數據 /// </summary> /// <returns></returns> public object ToObject() { return _sourceObj; } /// <summary> /// 轉換為json串 /// </summary> /// <returns></returns> public string ToJson() { StringBuilder sb = new StringBuilder(); if (IsObject) { sb.Append("{"); Dictionary<string, JsonObject> objs = dictionary(); List<string> keys = new List<string>(objs.Keys); int i; for (i = 0; i < keys.Count - 1; i++) { sb.Append("\""); sb.Append(keys[i]); sb.Append("\":"); sb.Append(objs[keys[i]].ToJson()); sb.Append(","); } sb.Append("\""); sb.Append(keys[i]); sb.Append("\":"); sb.Append(objs[keys[i]].ToJson()); sb.Append("}"); } else if (IsArray) { sb.Append("["); List<JsonObject> objs = array(); int i; for (i = 0; i < objs.Count - 1; i++) { sb.Append(objs[i].ToJson()); sb.Append(","); } sb.Append(objs[i].ToJson()); sb.Append("]"); } else { if (!IsString) { if (IsBool) { sb.Append(((bool)_sourceObj) ? "true" : "false"); } else if (IsNull) { sb.Append("null"); } else { sb.Append(_sourceObj); } } else { sb.Append("\""); sb.Append(_sourceObj); sb.Append("\""); } } return sb.ToString(); } /// <summary> /// 將jsonobject轉換為實體object /// 有參的 /// </summary> /// <typeparam name="T">實體object類型</typeparam> /// <param name="ctor">構造參數</param> /// <returns></returns> public T ToObject<T>(params object[] ctor) { object targetObj = null; if (this.IsObject || this.IsArray) { Type targetObjType = typeof(T); targetObj = CreateObject(targetObjType, ctor); } return (T)ConvertToObject(targetObj, this); } /// <summary> /// 將jsonobject轉換為實體object /// 無參的 /// </summary> /// <typeparam name="T">實體構造類型</typeparam> /// <returns></returns> public T ToObject<T>() { return ToObject<T>(null); } private object ConvertToObject(object targetObj, JsonObject obj) { Type targetType = null; if (targetObj != null) targetType = targetObj.GetType(); //判斷下object if (obj.IsObject) { Dictionary<string, JsonObject> dictionarys = obj.dictionary(); Dictionary<string, JsonObject>.Enumerator enumerator = dictionarys.GetEnumerator(); while (enumerator.MoveNext()) { string key = enumerator.Current.Key; JsonObject value = enumerator.Current.Value; PropertyInfo info = targetType.GetProperty(key, BindingFlags.Instance | BindingFlags.IgnoreCase | BindingFlags.Public); if (targetType.IsGenericType) { if (targetType.GetGenericTypeDefinition() == typeof(Dictionary<,>)) { object setInnerValue = null; Type innerValueType = targetType.GetGenericArguments()[1]; setInnerValue = GetJsonObjectEntity(innerValueType, value); setInnerValue = ConvertToObject(setInnerValue, value); MethodInfo add_info = targetType.GetMethod("Add"); add_info.Invoke(targetObj, new object[] { key, setInnerValue }); } else { throw new Exception("\"" + targetType.Name + "\"屬性 \"" + key + "\"不是Dictionary泛型類型"); } } else if (info != null) { object innerObj = info.GetValue(targetObj, null); if (innerObj == null) innerObj = GetJsonObjectEntity(info.PropertyType, value); innerObj = ConvertToObject(innerObj, value); info.SetValue(targetObj, innerObj, null); } else { throw new Exception("\"" + targetType.Name + "\"類中找不到屬性 \"" + key + "\"無法完成轉換操作"); } } } else if (obj.IsArray) { List<JsonObject> arrays = obj.array(); for (int i = 0; i < arrays.Count; i++) { JsonObject item = arrays[i]; if (targetType.IsGenericType) { Type[] types = targetType.GetGenericArguments(); Type objType = types[0]; object innerObj = GetJsonObjectEntity(objType, item); innerObj = ConvertToObject(innerObj, item); MethodInfo info = targetType.GetMethod("Add"); info.Invoke(targetObj, new object[] { innerObj }); } else if (targetType.IsArray) { object innerObj = GetJsonObjectEntity(targetType, item); innerObj = ConvertToObject(innerObj, item); MethodInfo info = targetType.GetMethod("SetValue", new Type[] { typeof(object), typeof(int) }); info.Invoke(targetObj, new object[] { innerObj, i }); } } } else { return obj._sourceObj; } return targetObj; } private object GetJsonObjectEntity(Type type, JsonObject value) { object innerObj = null; if (value.IsObject && innerObj == null) { innerObj = CreateObject(type, null); } else if (value.IsArray) { if (innerObj == null) { if (type.IsGenericType) { innerObj = CreateObject(type, null); } else if (type.IsArray) { if (type.GetArrayRank() > 1) { throw new Exception("暫不支持1維數組以上的數據類型"); } innerObj = type.InvokeMember("Set", BindingFlags.CreateInstance, null, null, new object[] { value.Count }); } } } return innerObj; } private object CreateObject(Type objType, params object[] ctor) { try { object targetObj; if (ctor == null) targetObj = Activator.CreateInstance(objType); else targetObj = Activator.CreateInstance(objType, ctor); return targetObj; } catch (Exception ex) { throw new Exception("構造\"" + objType.FullName + "\"過程中出現異常 可能是類構造函數異常也可能是其他的異常 詳細參見InnerException", ex); } } View Code

恩 沒錯 這就是 這整個的JsonObject了 我基本加了隱式 轉換 get set訪問器刪除方法 增加方法 設置方法等等 還真是功能繁多啊

其中支持 Array數組的轉換  List<T>泛型的轉換 甚至 Dictionary<string,TV>的轉換  當然 字典類型的話key必須固定為string在復雜的json也不支持啊 嘿嘿

從上面的一堆Is***的屬性來看是為了判斷這個json object的類型  因為我定義了萬能類 也就是說這個類既代表object也代表array

有個特殊的構造函數 是 public JsonObject(object obj) 這是為了自己手動構造json 所創建的

這個類也沒什麼好講解的核心的就是 相互轉換 還有ToJson這個方法 將這個類轉換為Json格式內容

 

忘貼使用方法了....

 這是為了 轉換過來 當然可以忽略

public class obj
{
    public string obj1 { get; set; }
    public obj2 obj2 { get; set; }
    public List<object[]> array { get; set; }
    public object null_test { get; set; }
}

public class obj2
{
    public string a1 { get; set; }
}

恩這才是貨真價實的轉換出來的代碼~

string json = @"{ 'obj1': 'asd', 'obj2': { 'a1': 'a1_test' }, 'array': [ [ 1, 2, 3, 4, 5, true, null ] ], 'null_test': null }";
JsonSerialization js = new JsonSerialization(json);
JsonObject jsonObj = js.Deserializa();
obj o = js.Deserializa<obj>();

//自定義構造json
JsonObject obj2 = new JsonObject();
obj2.Set("hello", "word");
obj2.Set("obj", o);
string str = obj2.ToJson();
//str = {"hello":"word","obj":{"obj1":"asd","obj2":{"a1":"a1_test"},"array":[[1,2,3,4,5,true]],"null_test":null}}

str = js.Serializa(obj2);
//str = {"hello":"word","obj":{"obj1":"asd","obj2":{"a1":"a1_test"},"array":[[1,2,3,4,5,true]],"null_test":null}}
string value = obj2["hello"].ToObject<string>();
//value = word;

 

當然我做的這個也不是很完美  如果有啥問題 可以及時和我溝通 一起來完善~

經過一位博友的點撥 做了IList的適配以及IDictionary的適配 還有一些特定的轉義字符的轉換~

QQ:1026926092 (ps:請注明來源否則不加)

完整類庫在這裡: 下載地址

原帖地址: http://www.cnblogs.com/anonymous5L/p/json_decode_deep.html


一個C語言冒泡排序法的簡單程序

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");
}

--------------
冒泡算法
冒泡排序的算法分析與改進
交換排序的基本思想是:兩兩比較待排序記錄的關鍵字,發現兩個記錄的次序相反時即進行交換,直到沒有反序的記錄為止。
應用交換排序基本思想的主要排序方法有:冒泡排序和快速排序。

冒泡排序

1、排序方法
將被排序的記錄數組R[1..n]垂直排列,每個記錄R看作是重量為R.key的氣泡。根據輕氣泡不能在重氣泡之下的原則,從下往上掃描數組R:凡掃描到違反本原則的輕氣泡,就使其向上"飄浮"。如此反復進行,直到最後任何兩個氣泡都是輕者在上,重者在下為止。
(1)初始
R[1..n]為無序區。

(2)第一趟掃描
從無序區底部向上依次比較相鄰的兩個氣泡的重量,若發現輕者在下、重者在上,則交換二者的位置。即依次比較(R[n],R[n-1]),(R[n-1],R[n-2]),…,(R[2],R[1]);對於每對氣泡(R[j+1],R[j]),若R[j+1].key<R[j].key,則交換R[j+1]和R[j]的內容。
第一趟掃描完畢時,"最輕"的氣泡就飄浮到該區間的頂部,即關鍵字最小的記錄被放在最高位置R[1]上。

(3)第二趟掃描
掃描R[2..n]。掃描完畢時,"次輕"的氣泡飄浮到R[2]的位置上……
最後,經過n-1 趟掃描可得到有序區R[1..n]
注意:
第i趟掃描時,R[1..i-1]和R[i..n]分別為當前的有序區和無序區。掃描仍是從無序區底部向上直至該區頂部。掃描完畢時,該區中最輕氣泡飄浮到頂部位置R上,結果是R[1..i]變為新的有序區。

2、冒泡排序過程示例
對關鍵字序列為49 38 65 97 76 13 27 49的文件進行冒泡排序的過程

3、排序算法
(1)分析
因為每一趟排序都使有序區增加了一個氣泡,在經過n-1趟排序之後,有序區中就有n-1個氣泡,而無序區中氣泡的重量總是大於等於有序區中氣泡的重量,所以整個冒泡排序過程至多需要進行n-1趟排序。
若在某一趟排序中未發現氣泡位置的交換,則說明待排序的無序區中所有氣泡均滿足輕者在上,重者在下的原則,因此,冒泡排序過程可在此趟排序後終止。為此,在下面給出的算法中,引入一個布爾量exchange,在每趟排序開始前,先將其置為FALSE。若排序過程中發生了交換,則將其置為TRUE。各趟排序結束時檢查exchange,若未曾發生過交換則終止算法,不再進行下一趟排序。

(2)具體算法
void BubbleSort(SeqList R)
{ //R(l..n)是待排序的文件,采用自下向上掃描,對R做冒泡排序
int i,j;
Boolean exchange; //交換標志
for(i=1;i&......余下全文>>
 

一個C語言冒泡排序法的簡單程序

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");
}

--------------
冒泡算法
冒泡排序的算法分析與改進
交換排序的基本思想是:兩兩比較待排序記錄的關鍵字,發現兩個記錄的次序相反時即進行交換,直到沒有反序的記錄為止。
應用交換排序基本思想的主要排序方法有:冒泡排序和快速排序。

冒泡排序

1、排序方法
將被排序的記錄數組R[1..n]垂直排列,每個記錄R看作是重量為R.key的氣泡。根據輕氣泡不能在重氣泡之下的原則,從下往上掃描數組R:凡掃描到違反本原則的輕氣泡,就使其向上"飄浮"。如此反復進行,直到最後任何兩個氣泡都是輕者在上,重者在下為止。
(1)初始
R[1..n]為無序區。

(2)第一趟掃描
從無序區底部向上依次比較相鄰的兩個氣泡的重量,若發現輕者在下、重者在上,則交換二者的位置。即依次比較(R[n],R[n-1]),(R[n-1],R[n-2]),…,(R[2],R[1]);對於每對氣泡(R[j+1],R[j]),若R[j+1].key<R[j].key,則交換R[j+1]和R[j]的內容。
第一趟掃描完畢時,"最輕"的氣泡就飄浮到該區間的頂部,即關鍵字最小的記錄被放在最高位置R[1]上。

(3)第二趟掃描
掃描R[2..n]。掃描完畢時,"次輕"的氣泡飄浮到R[2]的位置上……
最後,經過n-1 趟掃描可得到有序區R[1..n]
注意:
第i趟掃描時,R[1..i-1]和R[i..n]分別為當前的有序區和無序區。掃描仍是從無序區底部向上直至該區頂部。掃描完畢時,該區中最輕氣泡飄浮到頂部位置R上,結果是R[1..i]變為新的有序區。

2、冒泡排序過程示例
對關鍵字序列為49 38 65 97 76 13 27 49的文件進行冒泡排序的過程

3、排序算法
(1)分析
因為每一趟排序都使有序區增加了一個氣泡,在經過n-1趟排序之後,有序區中就有n-1個氣泡,而無序區中氣泡的重量總是大於等於有序區中氣泡的重量,所以整個冒泡排序過程至多需要進行n-1趟排序。
若在某一趟排序中未發現氣泡位置的交換,則說明待排序的無序區中所有氣泡均滿足輕者在上,重者在下的原則,因此,冒泡排序過程可在此趟排序後終止。為此,在下面給出的算法中,引入一個布爾量exchange,在每趟排序開始前,先將其置為FALSE。若排序過程中發生了交換,則將其置為TRUE。各趟排序結束時檢查exchange,若未曾發生過交換則終止算法,不再進行下一趟排序。

(2)具體算法
void BubbleSort(SeqList R)
{ //R(l..n)是待排序的文件,采用自下向上掃描,對R做冒泡排序
int i,j;
Boolean exchange; //交換標志
for(i=1;i&......余下全文>>
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved